在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];
这是一个小问题,但它每隔一段时间就会出现问题......我不喜欢这样一个事实:我没有使用变量;)
答案 0 :(得分:38)
技术答案是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.
答案 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 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数组助手
答案 8 :(得分:0)
尽管PHP> = 5.4中已添加了取消引用的事实,但您可以使用三元运算符在一行中完成它:
echo $var=($var=array(0,1,2,3))?$var[3]:false;
这样,您就不会仅将数组保留为变量。并且您不需要额外的功能...如果在函数中使用此行,它将在末尾自动销毁,但您也可以自己销毁它,如后面的代码中unset
所述:它不用于函数中。