【问题标题】:PHP - Get array value with a numeric indexPHP - 使用数字索引获取数组值
【发布时间】:2011-09-17 18:51:47
【问题描述】:

我有一个类似的数组:

$array = array('foo' => 'bar', 33 => 'bin', 'lorem' => 'ipsum');
echo native_function($array, 0); // bar
echo native_function($array, 1); // bin
echo native_function($array, 2); // ipsum

所以,这个原生函数会根据数字索引(第二个参数)返回一个值,忽略关联键,寻找数组中的实际位置。

在 PHP 中是否有任何本机函数可以做到这一点,或者我应该编写它吗? 谢谢

【问题讨论】:

  • 这听起来是个坏主意。你需要这个做什么?在这种情况下,实际上有数字键和foo 值作为子数组的成员不是更可取吗?
  • 我也认为,这看起来像是糟糕的设计。你能告诉我们你想做什么吗?也许有更好的解决方案。
  • PHP 的设计很糟糕!看起来 PHP 中有不同类型的数组。您必须将一个数组转换为另一个数组才能通过索引实际访问项目。

标签: php arrays get indexing numeric


【解决方案1】:

array_values() 几乎可以满足您的需求:

$numeric_indexed_array = array_values($your_array);
// $numeric_indexed_array = array('bar', 'bin', 'ipsum');
print($numeric_indexed_array[0]); // bar

【讨论】:

  • ...并且,从 PHP 5.4 开始,将其粉碎为: print (array_values($your_array)[0]);
【解决方案2】:
$array = array('foo' => 'bar', 33 => 'bin', 'lorem' => 'ipsum');
$array = array_values($array);
echo $array[0]; //bar
echo $array[1]; //bin
echo $array[2]; //ipsum

【讨论】:

    【解决方案3】:

    是的,对于标量值,implodearray_slice 的组合就可以了:

    $bar = implode(array_slice($array, 0, 1));
    $bin = implode(array_slice($array, 1, 1));
    $ipsum = implode(array_slice($array, 2, 1));
    

    或者将它与array_valueslist 混合使用(感谢@nikic),以便它适用于所有类型的值:

    list($bar) = array_values(array_slice($array, 0, 1));
    

    【讨论】:

    • +1 虽然我会使用 list($bar) = array_slice($array, 0, 1) 来消除标量值限制 ;)
    • @nikic:我想过,不幸的是,array_slice 会保留字符串键(即使 preserve_keysfalse),所以你可以在这种情况下不要使用list,除非你array_values 得到的数组。无论如何,我想这也是一个解决方案,已编辑。谢谢。
    【解决方案4】:

    我针对array_values( ) 函数的任何缺点提出我的想法,因为我认为这不是直接获取函数。 通过这种方式,它必须创建数字索引数组的值的副本,然后访问。如果 PHP 没有隐藏在所需元素的位置自动转换整数的方法,也许更好的解决方案可能包括一个函数,该函数使用计数器运行数组,直到它到达所需位置,然后返回到达的元素.

    因此,该工作将针对非常大的数组进行优化,因为该算法将是小型索引的最佳性能,立即停止。然而,在array_values( ) 突出显示的解决方案中,它与流经整个数组的循环有关,即使,例如,我必须访问 $ 数组 [1]。

    function array_get_by_index($index, $array) {
    
        $i=0;
        foreach ($array as $value) {
            if($i==$index) {
                return $value;
            }
            $i++;
        }
        // may be $index exceedes size of $array. In this case NULL is returned.
        return NULL;
    }
    

    【讨论】:

    • 但是如果false 是一个获取的值呢?返回null 仍然很糟糕,但比false 好。
    • 考虑到类型的一致性,如果输入索引超过数组的大小,或者索引输入的目标值为 NULL,我会得到 NULL 值。在这种情况下,我同意你的看法。然而 FALSE 和 NULL 在函数 empty() 上给出相同的结果,这将是在任何情况下执行的下一个检查,调用这个函数是有意义的。
    猜你喜欢
    • 2016-03-20
    • 2016-02-03
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多