我有一个数组:

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

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

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

我该怎么做呢?


当前回答

$arr = $array = array( 9 => 'apple', 7 => 'orange', 13 => 'plum' );
echo reset($arr); // echoes 'apple'

如果不想丢失当前指针的位置,只需为数组创建一个别名。

其他回答

查找数组中的第一个和最后一个项:

// Get the first item in the array
print $array[0]; // Prints 1

// Get the last item in the array
print end($array);

我不喜欢摆弄数组的内部指针,但是用array_keys()或array_values()构建第二个数组也很低效,所以我通常定义这个:

function array_first(array $f) {
    foreach ($f as $v) {
        return $v;
    }
    throw new Exception('array was empty');
}

当前数组($)

根据PHP手册,返回数组的第一个元素。

每个数组都有一个指向其“当前”元素的内部指针,该指针被初始化为插入数组的第一个元素。

所以它一直工作,直到你重新定位数组指针,否则你将不得不使用reset(),它将倒带数组并返回数组的第一个元素

根据PHP手动复位。

Reset()将数组的内部指针倒回到第一个元素,并返回第一个数组元素的值。

current()和reset()的示例

$array = array('step one', 'step two', 'step three', 'step four');

// by default, the pointer is on the first element
echo current($array) . "<br />\n"; // "step one"

//Forward the array pointer and then reset it

// skip two steps
next($array);
next($array);
echo current($array) . "<br />\n"; // "step three"

// reset pointer, start again on step one
echo reset($array) . "<br />\n"; // "step one"

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

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

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

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

来自PHP的文档:

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

描述:

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

我喜欢“列表”的例子,但是“列表”只适用于赋值的左边。如果我们不想赋值一个变量,我们将被迫创建一个临时名称,这在最好的情况下会污染我们的作用域,在最坏的情况下会覆盖现有的值:

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())));