我有一个数组:
阵列(4 = > '苹果',7 = >“橙色”,13 = >“李子”)
我想要得到这个数组的第一个元素。预期结果:串苹果
一个要求:它不能通过引用传递来完成,所以array_shift不是一个好的解决方案。
我该怎么做呢?
我有一个数组:
阵列(4 = > '苹果',7 = >“橙色”,13 = >“李子”)
我想要得到这个数组的第一个元素。预期结果:串苹果
一个要求:它不能通过引用传递来完成,所以array_shift不是一个好的解决方案。
我该怎么做呢?
当前回答
假设:
$array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
只使用:
$array[key($array)]
得到第一个元素或
key($array)
得到第一把钥匙。
如果你想删除第一个,你也可以取消它的链接。
其他回答
一些数组不能与list、reset或current等函数一起使用。也许它们是“人造”数组——例如,部分实现了ArrayIterator。
如果你想拉出第一个值而不考虑数组,你可以短路迭代器:
foreach($array_with_unknown_keys as $value) break;
然后你的值将在$value中可用,循环将在第一次迭代后中断。这比将一个潜在的大数组复制到array_unshift(array_values($arr))这样的函数更有效。
你也可以用这种方式获取钥匙:
foreach($array_with_unknown_keys as $key=>$value) break;
如果你从函数中调用这个函数,只要提前返回:
function grab_first($arr) {
foreach($arr as $value) return $value;
}
我认为使用array_values是最好的选择。你可以从函数的结果中返回下标0处的值,得到'apple'。
保持简单!这里有很多正确答案,但为了尽量减少所有的混乱,这两个方法有效,并减少了大量的开销:
Key ($array)获取数组的第一个键 Current ($array)获取数组的第一个值
编辑: 关于下面的评论。以下示例将输出string(13)“PHP代码测试”
$array = array
(
'1' => 'PHP code test',
'foo' => 'bar', 5 , 5 => 89009,
'case' => 'Random Stuff: '.rand(100,999),
'PHP Version' => phpversion(),
0 => 'ending text here'
);
var_dump(current($array));
我喜欢“列表”的例子,但是“列表”只适用于赋值的左边。如果我们不想赋值一个变量,我们将被迫创建一个临时名称,这在最好的情况下会污染我们的作用域,在最坏的情况下会覆盖现有的值:
list($x) = some_array();
var_dump($x);
上面的代码将覆盖$x的任何现有值,只要这个作用域是活动的,$x变量就会一直存在(函数/方法的结束,如果我们在顶层,则永远存在)。这可以使用call_user_func和一个匿名函数来解决,但它很笨拙:
var_dump(call_user_func(function($arr) { list($x) = $arr; return $x; },
some_array()));
如果我们使用这样的匿名函数,我们实际上可以避开reset和array_shift,即使它们使用引用传递。这是因为调用一个函数会绑定它的参数,这些参数可以通过引用传递:
var_dump(call_user_func(function($arr) { return reset($arr); },
array_values(some_array())));
然而,这实际上是多余的,因为call_user_func将在内部执行这个临时赋值。这让我们可以像处理值传递一样处理引用传递函数,没有任何警告或错误:
var_dump(call_user_func('reset', array_values(some_array())));
一行闭行,复制,重置:
<?php
$fruits = array(4 => 'apple', 7 => 'orange', 13 => 'plum');
echo (function() use ($fruits) { return reset($fruits); })();
输出:
apple
或者更短的短箭头函数:
echo (fn() => reset($fruits))();
这使用如上所述的按值变量绑定。两者都不会改变原来的指针。