数组:使用array_shift($arr)还是$arr[0]?

5

你会选择哪个?

基本上我只想从一个数组中获取第一个元素,仅此而已。


2
以上都不是你想要的。$first = reset($array); 是你想要的。它可以正确地处理你输入的任何内容。 - Jon
@Jon:我已经涵盖了那个。 :) - Lightness Races in Orbit
@TomalakGeret'kal:那么…我应该删除这条评论吗? - Jon
@Jon:现在这样做也没有用。无论如何,这个问题现在已经充斥着重复的回答了。 - Lightness Races in Orbit
11个回答

16

它们做的事情不同。

  • array_shift($arr) 从数组中取出第一个元素并返回给你。

  • $arr[0] 只是直接返回它... 如果 数组的键名是数字。

适用于关联数组和数字键名的另一种替代方法是reset($arr)。这确实会移动数组的内部指针,但除非你在使用那些函数,否则这不太可能影响你。


13

6
你将使用$arr[ 0 ];array_shift从数组中删除第一个元素。

编辑


这个答案实际上在不完整和错误之间,但由于两个jon的评论,我认为它应该留下来,以便其他人可以看到这种讨论。

正确的答案:

  • reset是返回数组的第一个定义索引的方法。 即使在非关联数组中,这也可能不是0索引。
  • array_shift将删除并返回在reset中找到的值

OP做出的假设$arr[0]是第一个索引,在特定上下文中并不准确。


我看到的来自其他人的数字/关联注释非常重要。 - jon_darkstar
根据问题,关联数组不是问题。如果你只想从一个数组中获取第一个元素,那就是这个答案了。如果不是,那么这个答案可能不是最完整的。 - cwallenpoole
不,它们并不是,但我理解这个问题的本质是:“在草莓和开心果之间选择,说出你最喜欢的冰淇淋。” 正确答案是两者都不选(非常喜欢芝士蛋糕)。但是,假设我只能在这两种选择中进行,那么我会选择草莓。 - cwallenpoole
@Jon 你是对的。我错了。@jon_darkstar 老实说,这可能不是最好的方法,但我想我必须承认我的错误,直到我改掉这个坏习惯。看来这是我还没有改掉的坏习惯。 - cwallenpoole
就目前的答案而言,我个人认为它应该保留下来,即使只是作为一种与最初意图不同的教训。 - cwallenpoole
显示剩余3条评论

4
$arr[0] 只在数组以数字键时起作用。
array_shift()从数组中移除元素并修改该数组本身。
如果您不确定第一个键是什么,且不想将其从数组中移除,可以使用:
<?php
foreach($arr $k=>$v){
   $value = $v;
   break;
}

甚至更好的是:
<?php
reset($arr);
$value = current($arr);

2

如果你有一个关联数组,你也可以使用reset($arr):它返回第一个元素(不会删除),并将数组指针设置为该元素。

但最快的方法是使用$arr[0]


1

如果您不想更改所讨论的数组,请使用$arr[0](仅获取第一个元素),否则,如果您想从$arr中删除第一个元素并将其从$arr中移除,请使用array_shift($arr)

例如:

$arr=array(3,-6,2);
$foo=$arr[0]; //$foo==3 and $arr==array(3,-6,2).
$bar=array_shift($arr); //$bar==3 and $arr==array(-6,2).

预计时间:正如其他人所指出的那样,请确保您的数组不是关联数组(即键为0,1,...,(sizeof($arr)-1)),否则这可能不起作用。


1

你想同时修改 arr 数组吗?array_shift 移除数组的第一个元素并返回它,因此数组已经改变了。$arr[0] 只是给出了第一个元素。

我会使用 $arr[0],除非我明确想要修改数组。你可能会在后面添加代码来使用 arr 数组,而忘记它已经被修改了。


1

根据你的需要,$arr[0] 更好,因为它更快。array_shift 用于其他情况。


1

arrshift更可靠,它总是返回数组中的第一个元素,但这也通过删除该元素来修改数组。

如果您的数组不从0索引开始,则arr [0]将失败,但不会影响数组本身。

一种更复杂但更可靠的方法是:

$keys = array_keys($arr);
$first = $arr[$keys[0]];

1
如果你想获取数组的第一个元素,使用 $arr[0] 的形式。优点是简单、易读和易于维护。保持事情简单明了。
编辑:仅在您知道数组具有从0开始的默认键时才使用索引0。

还需要考虑很多可能的输入,例如 array('foo' => 'bar')array(1 => 1, 0 => 0) 的可破坏性。 - Jon
如果你仔细想一下,你现在的答案应该是这样的:要读取$arr的第一个元素,请使用$arr[0]。但是,只有当第一个元素具有键0时才能这样做。 这可能不会误导人,但也不是非常有用。为什么不让它变得更有用呢? :) - Jon

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