PHP:即时访问数组值

时间:2008-08-16 12:42:54

标签: php arrays coding-style

在php中,我经常需要使用数组映射一个变量......但我似乎无法在一个衬里中执行此操作。 C.F.例如:

// 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];

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

9 个答案:

答案 0 :(得分:38)

技术答案是P​​HP语言的 语法 仅允许在变量表达式结尾处使用下标表示法而不是表达式一般来说,它在大多数其他语言中的工作方式。我一直把它看作是语言的缺陷,因为有可能有一个语法可以明确地解析任何表达式的下标。然而,情况可能就是他们使用的是一种不灵活的解析器生成器,或者他们根本不想破坏某种向后兼容性。

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

$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.

答案 1 :(得分:23)

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

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

答案 2 :(得分:16)

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

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

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

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

并将其称为:

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

现在应该自动销毁数组。

答案 3 :(得分:5)

这可能没有直接关系。但是我找到了解决这个特定问题的解决方案。

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

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() ) )

所以,这是在一行:) 希望这会对某人有所帮助。

答案 4 :(得分:2)

function doSomething()
{
    return $somearray;
}

echo doSomething()->get(1)->getOtherPropertyIfThisIsAnObject();

答案 5 :(得分:1)

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

$myvar = array_shift(array_splice(myfunc(),2));

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

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

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

这样,您就不会仅将数组保留为变量。并且您不需要额外的功能...如果在函数中使用此行,它将在末尾自动销毁,但您也可以自己销毁它,如后面的代码中unset所述:它不用于函数中。

答案 8 :(得分: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数组助手