PHP - 使用数字索引获取数组值

58
我有一个数组,例如:
$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中是否有任何原生函数可以执行此操作,还是我需要自己编写?谢谢。


3
听起来这个想法不太好。你需要它来做什么?如果在这种情况下实际上有数字键和将“foo”值作为子数组成员会不是更好吗? - Pekka
我也认为这看起来像是糟糕的设计。你能告诉我们你想做什么吗?也许有更好的解决方案。 - Alp
PHP的设计很糟糕!看起来PHP有不同类型的数组。你必须将一个数组转换为另一个数组,才能通过索引实际访问其中的项目。 - Bitterblue
4个回答

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

1
至少在非古老版本的PHP中,如果您不需要反复使用它,则array_values($array)[0]对于引用来说是可以正常工作的。如果您需要反复使用它,则迭代可能是更好的选择。 - Blue Dev

20

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]); - Pancho

7
我提出了关于it技术中array_values( )函数的一些想法,因为我认为它并不是一个直接的获取函数。这种方式需要创建一个值为数字索引的数组的副本,然后再进行访问。如果PHP没有隐藏一个自动将所需元素位置的整数转换的方法,也许一个稍微更好的解决方案可能包括一个函数,该函数通过计数器运行数组直到达到所需位置,然后返回达到的元素。这样,对于非常大的数组大小,工作将得到优化,因为算法将在小的索引上表现最佳,并立即停止。然而,在array_values( )的解决方案中,它必须通过整个数组进行循环,即使例如我只需要访问$ array [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”好。 - user619271
考虑到类型的一致性,如果输入索引超出数组大小或者目标值为NULL,则我会得到NULL值。在这种情况下,我同意你的看法。但是,在函数empty()中FALSE和NULL会给出相同的结果,因此无论在什么场景下,执行下一个检查都是有意义的,所以调用这个函数是有意义的。 - and.ryx

5

是的,对于标量值,可以使用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
+1 虽然我会使用 list($bar) = array_slice($array, 0, 1) 来消除标量值限制 ;) - NikiC
@nikic: 我考虑过这个问题,不幸的是,array_slice会保留字符串键(即使preserve_keysfalse),所以在这种情况下你不能使用list,除非你对结果数组进行array_values。无论如何,我想那也是一个解决方案,已经编辑了。谢谢。 - netcoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接