PHP:动态访问数组值
Posted
技术标签:
【中文标题】PHP:动态访问数组值【英文标题】:PHP: Access Array Value on the Fly 【发布时间】:2010-09-06 00:01:04 【问题描述】:在 php 中,我经常需要使用数组来映射变量……但我似乎无法在单行中做到这一点。参考文献示例:
// 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 v5.4
开始工作,PHP <= v5.3
中的语法非法
【参考方案1】:
技术上的答案是 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.
【讨论】:
至少对第二种语法有一个更改建议,但被拒绝了:wiki.php.net/rfc/functionarraydereferencing 状态现在更改为接受wiki.php.net/rfc/functionarraydereferencing 这个答案不再准确。自 5.5 起,PHP 支持常量/数组/字符串取消引用 wiki.php.net/rfc/constdereference @John,你为什么说它会“破坏某种向后兼容性”?他们确实在 5.4 中引入了它,那么存在什么样的向后兼容性问题?【参考方案2】:这称为数组解引用。它已在 php 5.4 中添加。 http://www.php.net/releases/NEWS_5_4_0_alpha1.txt
update[2012-11-25]: 自 PHP 5.5 起,取消引用已添加到内容/字符串以及数组中
【讨论】:
【参考方案3】:真的,我不会担心那个额外的变量。但是,如果您愿意,也可以在使用后将其从内存中删除:
$variable = array('a','b','c');
echo $variable[$key];
unset($variable);
或者,你可以写一个小函数:
function indexonce(&$ar, $index)
return $ar[$index];
然后调用它:
$something = indexonce(array('a', 'b', 'c'), 2);
现在应该自动销毁数组了。
【讨论】:
@onnodb,Strict Standards: Only variables should be passed by reference
用于您的功能indexonce
。为什么要添加&
引用?【参考方案4】:
这可能没有直接关系。但我来这篇文章是为了解决这个特定问题。
我从以下形式的函数中得到结果。
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() ) )
所以,它是在一行中完成的 :) 希望对某人有所帮助。
【讨论】:
这只适用于最后一个值,您将从原始数组中删除该值。【参考方案5】:function doSomething()
return $somearray;
echo doSomething()->get(1)->getOtherPropertyIfThisIsAnObject();
【讨论】:
你怎么能在数组上做get(1)
?致命错误:在第 21 行对 file.php 中的非对象调用成员函数 get()【参考方案6】:
其实有一个优雅的解决方案:)下面会将myfunc返回的数组的第三个元素赋值给$myvar:
$myvar = array_shift(array_splice(myfunc(),2));
【讨论】:
【参考方案7】:或者类似的东西,如果你需要变量中的数组值
$variable = array('a','b','c');
$variable = $variable[$key];
【讨论】:
【参考方案8】:您可以使用 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 数组助手
【讨论】:
【参考方案9】:虽然在 PHP >=5.4 中添加了取消引用这一事实,但您可以使用三元运算符在一行中完成:
echo $var=($var=array(0,1,2,3))?$var[3]:false;
这样你就不会只保留数组变量。并且您不需要额外的函数来执行此操作...如果在函数中使用此行,它将在最后自动销毁,但您也可以自己销毁它,如代码后面的unset
所述,如果它是未在函数中使用。
【讨论】:
以上是关于PHP:动态访问数组值的主要内容,如果未能解决你的问题,请参考以下文章
Java基础知识点(数组的地址值及元素访问和动态初始化数组默认初始值的变化规律)
使用 PHP 从动态输入字段中捕获数组值并通过电子邮件发送它们