50

在 php 中,我经常需要使用数组来映射变量……但我似乎无法在一个内衬中做到这一点。cf 示例:

// the following results in an error:
echo array('a','b','c')[$key];

// this works, using an unnecessary variable:
$variable = array('a','b','c');
echo $variable[$key];

这是一个小问题,但它每隔一段时间就会出现问题......我不喜欢这样一个事实,即我没有使用变量;)

4

9 回答 9

40

技术上的答案是 PHP 语言的语法只允许在变量表达式的末尾使用下标符号,而不是一般的表达式,这就是它在大多数其他语言中的工作方式。我一直将其视为语言的缺陷,因为可以有一种语法可以明确地针对任何表达式解析下标。但是,可能是他们使用了不灵活的解析器生成器,或者他们只是不想破坏某种向后兼容性。

以下是有效表达式上无效下标的更多示例:

$x = array(1,2,3);
print ($x)[1]; //illegal, on a parenthetical expression, not a variable exp.

function ret($foo) { return $foo; }
echo ret($x)[1]; // illegal, on a call expression, not a variable exp.
于 2008-08-28T09:58:36.653 回答
23

这称为数组解引用。它已在 php 5.4 中添加。 http://www.php.net/releases/NEWS_5_4_0_alpha1.txt

更新[2012-11-25]:从 PHP 5.5 开始,取消引用已添加到内容/字符串以及数组

于 2011-10-25T11:28:48.267 回答
19

我真的不会为那个额外的变量而烦恼。但是,如果您愿意,也可以在使用后将其从内存中删除:

$variable = array('a','b','c');
echo $variable[$key];
unset($variable);

或者,您可以编写一个小函数:

function indexonce(&$ar, $index) {
  return $ar[$index];
}

并调用它:

$something = indexonce(array('a', 'b', 'c'), 2);

现在应该自动销毁该数组。

于 2008-08-16T12:55:29.953 回答
6

这可能没有直接关系。但我来到这篇文章寻找解决这个特定问题的方法。

我从以下形式的函数中得到了结果。

Array
(
    [School] => Array
            (
                [parent_id] => 9ce8e78a-f4cc-ff64-8de0-4d9c1819a56a
            )
)

我想要的是 parent_id 值“9ce8e78a-f4cc-ff64-8de0-4d9c1819a56a”。我使用了这样的功能并得到了它。

array_pop( array_pop( the_function_which_returned_the_above_array() ) )

所以,它是在一行中完成的 :) 希望它对某人有所帮助。

于 2011-12-23T07:36:14.593 回答
2
function doSomething()
{
    return $somearray;
}

echo doSomething()->get(1)->getOtherPropertyIfThisIsAnObject();
于 2011-02-18T10:40:42.493 回答
1

实际上,有一个优雅的解决方案:) 下面将把 myfunc 返回的数组的第三个元素分配给 $myvar:

$myvar = array_shift(array_splice(myfunc(),2));
于 2010-05-26T11:50:04.483 回答
0

或者类似的东西,如果你需要变量中的数组值

$variable = array('a','b','c');
$variable = $variable[$key];
于 2009-08-13T06:29:03.100 回答
0

您可以使用 php array_*函数想出几个oneliners 。但我向您保证,这样做与您想要实现的目标相比完全是多余的。

您可以使用以下示例,但这不是一个优雅的解决方案,我不确定它的性能;

   array_pop ( array_filter( array_returning_func(), function($key){    return $key=="array_index_you_want"? TRUE:FALSE;    },ARRAY_FILTER_USE_KEY ) );

如果您使用的是 php 框架并且您被旧版本的 php 卡住了,那么大多数框架都有帮助库。

示例:Codeigniter 数组助手

于 2016-02-24T11:46:04.177 回答
0

尽管在 PHP >=5.4 中添加了取消引用这一事实,但您可以使用三元运算符在一行中完成:

echo $var=($var=array(0,1,2,3))?$var[3]:false;

这样你就不会只保留数组变量。并且您不需要额外的函数来执行此操作...如果在函数中使用此行,它将在最后自动销毁,但您也可以自己销毁它,如unset代码后面所述,如果未使用一个函数。

于 2018-08-10T06:21:39.143 回答