【问题标题】:PHP: Access Array Value on the FlyPHP:动态访问数组值
【发布时间】: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 中的语法非法

标签: php arrays coding-style


【解决方案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.

【讨论】:

【解决方案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 所述,如果它是未在函数中使用。

          【讨论】:

            猜你喜欢
            • 2016-07-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-06-12
            • 2013-12-15
            相关资源
            最近更新 更多