我有一个数组:

阵列(4 = > '苹果',7 = >“橙色”,13 = >“李子”)

我想要得到这个数组的第一个元素。预期结果:串苹果

一个要求:它不能通过引用传递来完成,所以array_shift不是一个好的解决方案。

我该怎么做呢?


当前回答

正如Mike指出的(最简单的方法):

$arr = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
echo reset($arr); // Echoes "apple"

如果你想获取密钥:(重置后执行)

echo key($arr); // Echoes "4"

来自PHP的文档:

混合重置(数组|对象和$array);

描述:

reset()返回数组的内部指针指向第一个元素并返回第一个元素的值,如果数组为 空的。

其他回答

我认为使用array_values是最好的选择。你可以从函数的结果中返回下标0处的值,得到'apple'。

原来的答案,但代价高昂(O(n)):

array_shift(array_values($array));

在O (1):

array_pop(array_reverse($array));

其他用例,等等……

如果修改(在重置数组指针的意义上)$array不是一个问题,你可以使用:

reset($array);

如果需要数组“copy”,理论上这应该更有效:

array_shift(array_slice($array, 0, 1));

使用PHP 5.4+(但如果为空可能会导致索引错误):

array_values($array)[0];

这在现实世界中可不是那么简单的反应。假设我们有这些可能的回答的例子,你可以在一些图书馆找到。

$array1 = array();
$array2 = array(1,2,3,4);
$array3 = array('hello'=>'world', 'foo'=>'bar');
$array4 = null;

var_dump('reset1', reset($array1));
var_dump('reset2', reset($array2));
var_dump('reset3', reset($array3));
var_dump('reset4', reset($array4)); // Warning

var_dump('array_shift1', array_shift($array1));
var_dump('array_shift2', array_shift($array2));
var_dump('array_shift3', array_shift($array3));
var_dump('array_shift4', array_shift($array4)); // Warning

var_dump('each1', each($array1));
var_dump('each2', each($array2));
var_dump('each3', each($array3));
var_dump('each4', each($array4)); // Warning

var_dump('array_values1', array_values($array1)[0]); // Notice
var_dump('array_values2', array_values($array2)[0]);
var_dump('array_values3', array_values($array3)[0]);
var_dump('array_values4', array_values($array4)[0]); // Warning

var_dump('array_slice1', array_slice($array1, 0, 1));
var_dump('array_slice2', array_slice($array2, 0, 1));
var_dump('array_slice3', array_slice($array3, 0, 1));
var_dump('array_slice4', array_slice($array4, 0, 1)); // Warning

list($elm) = $array1; // Notice
var_dump($elm);
list($elm) = $array2;
var_dump($elm);
list($elm) = $array3; // Notice
var_dump($elm);
list($elm) = $array4;
var_dump($elm);

正如你所看到的,我们有几个“一条线”的解决方案,在某些情况下效果很好,但并不是所有情况都如此。

在我看来,只有数组才应该使用该处理程序。

现在说到性能,假设我们总是数组,像这样:

$elm = empty($array) ? null : ...($array);

...you would use without errors:
$array[count($array)-1];
array_shift
reset
array_values
array_slice

Array_shift比reset快,这比[count()-1]快,这三个比array_values和array_slice快。

Use:

$first = array_slice($array, 0, 1);  
$val= $first[0];

默认情况下,array_slice不保留键,所以我们可以安全地使用0作为索引。

你可以通过下面的代码获取第一个元素:

$array_key_set = array_keys($array);
$first_element = $array[$array_key_set[0]];

或者使用:

$i=0;
foreach($array as $arr)
{
  if($i==0)
  {
    $first_element=$arr;
    break;
  }
 $i++;
}
echo $first_element;