在php中,我经常需要使用数组来映射变量...但是我似乎无法在一个内衬中做到这一点。 c.f. 例:
1 2 3 4 5 6
| // 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]; |
这是一个小问题,但有时会不时出现错误……我不喜欢这样的事实,我什么都不用使用变量;)
技术上的答案是,PHP语言的语法仅允许在变量表达式的末尾使用下标符号,而不是一般在表达式的末尾,这就是它在大多数其他语言中的工作方式。我一直认为它是语言的不足之处,因为有可能有一种语法可以明确地针对任何表达式解析下标。但是,可能是因为他们使用的是不灵活的解析器生成器,或者他们只是不想破坏某种向后兼容性。
以下是有效表达式中无效下标的另外两个示例:
1 2 3 4 5
| $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. |
这称为数组解引用。它已在php 5.4中添加。
http://www.php.net/releases/NEWS_5_4_0_alpha1.txt
更新[2012-11-25]:自PHP 5.5起,取消引用已添加到contant / strings和arrays中
我真的不会去理会这个额外的变量。但是,如果需要,也可以在使用后将其从内存中删除:
1 2 3
| $variable = array('a','b','c');
echo $variable[$key];
unset($variable); |
或者,您可以编写一个小函数:
1 2 3
| function indexonce(&$ar, $index) {
return $ar[$index];
} |
并通过以下方式调用:
1
| $something = indexonce(array('a', 'b', 'c'), 2); |
现在应该自动销毁该阵列。
这可能没有直接关系。.但是我来到这篇文章中,找到了针对此特定问题的解决方案。
我从以下形式的函数中得到了结果。
1 2 3 4 5 6 7
| Array
(
[School] => Array
(
[parent_id] => 9ce8e78a-f4cc-ff64-8de0-4d9c1819a56a
)
) |
我想要的是parent_id值" 9ce8e78a-f4cc-ff64-8de0-4d9c1819a56a"。
我使用了这样的功能并得到了它。
1
| array_pop( array_pop( the_function_which_returned_the_above_array() ) ) |
所以,它是一行完成的:)
希望对别人有帮助。
1 2 3 4 5 6
| function doSomething()
{
return $somearray;
}
echo doSomething()->get(1)->getOtherPropertyIfThisIsAnObject(); |
实际上,有一个优雅的解决方案:)下面将把myfunc返回的数组的第3个元素分配给$ myvar:
1
| $myvar = array_shift(array_splice(myfunc(),2)); |
尽管在PHP> = 5.4中已经添加了取消引用的事实,但您可以使用三元运算符在一行中完成它:
1
| echo $var=($var=array(0,1,2,3))?$var[3]:false; |
这样,您就不会仅将数组保留为变量。而且您不需要额外的功能...如果在函数中使用此行,它将在末尾自动销毁,但您也可以自己销毁它,如后面的代码中使用unset所述未在函数中使用。
使用php array_ *函数,您可以提出几个oneliners。但我向您保证,比较您要实现的目标完全是多余的。
例如,您可以使用类似以下内容的方法,但这不是一个很好的解决方案,我不确定这样做的性能。
1
| array_pop ( array_filter( array_returning_func(), function($key){ return $key=="array_index_you_want"? TRUE:FALSE; },ARRAY_FILTER_USE_KEY ) ); |
如果您使用的是php框架,而您却坚持使用旧版本的php,则大多数框架都有帮助库。
示例:Codeigniter数组助手
或类似的东西,如果您需要变量中的数组值
1 2
| $variable = array('a','b','c');
$variable = $variable[$key]; |