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访问数组值的正确方法是啥

使用 PHP 从动态输入字段中捕获数组值并通过电子邮件发送它们

在类中创建一个空的动态数组,在访问时给出值?

jQuery - 在 AJAX POST 之后访问 PHP 数组值

php从函数返回中访问数组值