Получить первый элемент массива

У меня есть массив:

array( 4 => 'apple', 7 => 'orange', 13 => 'plum' )

Я хотел бы получить первый элемент этого массива. Ожидаемый результат: string apple

Одно требование: это невозможно сделать при передаче по ссылке, поэтому array_shift не является хорошим решением.

Как я могу это сделать?

Ответы

Ответ 1

Оригинальный ответ, но дорогой (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];

Ответ 2

Как указал Майк (самый простой способ):

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

Если вы хотите получить ключ: (выполните его после сброса)

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

Из документации PHP:

смешанный сброс (массив и $ массив);

Описание:

reset() перематывает внутренний указатель массива на первый элемент и возвращает значение первого элемента массива, или FALSE, если массив пуст.

Ответ 3

$first_value = reset($array); // First element value
$first_key = key($array); // First element key

Ответ 4

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

Если вы не хотите потерять текущую позицию указателя, просто создайте псевдоним для массива.

Ответ 5

current($array) может получить первый элемент массива, согласно руководству по PHP.

Каждый массив имеет внутренний указатель на свой "текущий" элемент, который инициализируется первым элементом, вставленным в массив.

Так что это работает до тех пор, пока вы не переместите указатель массива, иначе вам придется сбросить массив.

Ответ 6

Вы можете получить N-й элемент с помощью языковой конструкции "список":

// First item
list($firstItem) = $yourArray;

// First item from an array that is returned from a function
list($firstItem) = functionThatReturnsArray();

// Second item
list( , $secondItem) = $yourArray;

С array_keys функции array_keys вы можете сделать то же самое для ключей:

list($firstKey) = array_keys($yourArray);
list(, $secondKey) = array_keys($yourArray);

Ответ 7

PHP 5.4 +:

array_values($array)[0];

Ответ 8

Предположим, что:

$array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

Просто используйте:

$array[key($array)]

чтобы получить первый элемент или

key($array)

чтобы получить первый ключ.

Или вы можете отсоединить первый, если хотите его удалить.

Ответ 9

В PHP 7.3 добавлены две функции для получения первого и последнего ключа массива напрямую без изменения исходного массива и без создания каких-либо временных объектов:

Помимо того, что они семантически значимы, эти функции даже не перемещают указатель массива (как это делает foreach).

Имея ключи, можно получить значения по ключам напрямую.


Примеры (все они требуют PHP 7. 3+)

Получение первого/последнего ключа и значения:

$my_array = ['IT', 'rules', 'the', 'world'];

$first_key = array_key_first($my_array);
$first_value = $my_array[$first_key];

$last_key = array_key_last($my_array);
$last_value = $my_array[$last_key];

Получение первого/последнего значения в виде однострочников при условии, что массив не может быть пустым:

$first_value = $my_array[ array_key_first($my_array) ];

$last_value = $my_array[ array_key_last($my_array) ];

Получение первого/последнего значения в виде однострочников со значениями по умолчанию для пустых массивов:

$first_value = empty($my_array) ? 'default' : $my_array[ array_key_first($my_array) ];

$last_value = empty($my_array) ? 'default' : $my_array[ array_key_last($my_array) ];

Ответ 10

Некоторые массивы не работают с такими функциями, как 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;
}

Ответ 11

От помощников Laravel:

function head($array)
{
    return reset($array);
}

Массив, передаваемый в функцию по значению, метод reset() влияет на внутренний указатель копии массива и не касается исходного массива (обратите внимание, что он возвращает false если массив пуст).

Пример использования:

$data = ['foo', 'bar', 'baz'];

current($data); // foo
next($data); // bar
head($data); // foo
next($data); // baz

Также здесь есть альтернатива. Это очень незначительно быстрее, но интереснее. Это позволяет легко изменить значение по умолчанию, если массив пуст:

function head($array, $default = null)
{
    foreach ($array as $item) {
        return $item;
    }
    return $default;
}

Для записи, вот еще один мой ответ, для последнего элемента массива.

Ответ 12

Просто выполните:

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

Ответ 13

$arr = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
foreach($arr as $first) break;
echo $first;

Вывод:

apple

Ответ 14

Я бы сделал echo current($array).

Ответ 15

$myArray = array (4 => 'apple', 7 => 'orange', 13 => 'plum');
$arrayKeys = array_keys($myArray);

// The first element of your array is:
echo $myArray[$arrayKeys[0]];

Ответ 16

$array=array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

$firstValue = each($array)[1];

Это намного эффективнее, чем array_values(), потому что функция each() не копирует весь массив.

Подробнее см. http://www.php.net/manual/en/function.each.php

Ответ 17

Ключковый способ:

$foo = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

function get_first ($foo) {
    foreach ($foo as $k=>$v){
        return $v;
    }
}

print get_first($foo);

Ответ 18

Большинство из них работают! НО для быстрого однострочного (низкого ресурса) вызова:

$array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
echo $array[key($array)];

// key($array) -> will return the first key (which is 4 in this example)

Хотя это работает, и неплохо, пожалуйста, смотрите мой дополнительный ответ: fooobar.com/questions/12093/...

Ответ 19

Получить первый элемент:

array_values($arr)[0]

Получить последний элемент

array_reverse($arr)[0]

Ответ 20

Держите это просто! Здесь есть много правильных ответов, но чтобы минимизировать путаницу, эти две работы работают и уменьшают много накладных расходов:

key($array) получает первый ключ массива
current($array) получает первое значение массива

Ответ 21

Я думаю, что использовать array_values ​​ было бы лучше. Вы можете вернуть значение по индексу нуль из результата этой функции, чтобы получить "яблоко".

Ответ 22

Использование:

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

По умолчанию array_slice не сохраняет ключи, поэтому мы можем безопасно использовать нуль в качестве индекса.

Ответ 23

Два решения для вас.

Решение 1 - Просто используйте ключ. Вы не сказали, что вы не можете его использовать. :)

<?php
    // Get the first element of this array.
    $array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

    // Gets the first element by key
    $result = $array[4];

    // Expected result: string apple
    assert('$result === "apple" /* Expected result: string apple. */');
?>

Решение 2 - array_flip() + key()

<?php
    // Get first element of this array. Expected result: string apple
    $array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

    // Turn values to keys
    $array = array_flip($array);

    // You might thrown a reset in just to make sure
    // that the array pointer is at the first element.
    // Also, reset returns the first element.
    // reset($myArray);

    // Return the first key
    $firstKey = key($array);

    assert('$firstKey === "apple" /* Expected result: string apple. */');
?>

Решение 3 - array_keys()

echo $array[array_keys($array)[0]];

Ответ 24

Это немного поздно для игры, но я столкнулся с проблемой, когда мой массив содержал элементы массива как дочерние элементы внутри него, и поэтому я не мог просто получить строковое представление первого элемента массива. С помощью функции PHP current() мне удалось это:

<?php
    $original = array(4 => array('one', 'two'), 7 => array('three', 'four'));
    reset($original);  // to reset the internal array pointer...
    $first_element = current($original);  // get the current element...
?>

Благодаря всем текущим решениям мне удалось получить этот ответ, надеюсь, это поможет кому-нибудь когда-нибудь!

Ответ 25

Это не так просто ответ в реальном мире. Предположим, у нас есть примеры возможных ответов, которые вы можете найти в некоторых библиотеках.

$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.

Ответ 26

Небольшое изменение в том, что опубликовано в Sarfraz:

$array = array(1, 2, 3, 4, 5);
$output = array_slice($array, 0, 1);
print_r ($output);

Ответ 27

Мне нравится пример "списка", но "список" работает только с левой стороны задания. Если мы не хотим назначать переменную, мы будем вынуждены составлять временное имя, которое в лучшем случае загрязняет нашу область действия и в худшем случае перезаписывает существующее значение:

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, хотя они используют pass-by-reference. Это связано с тем, что вызов функции свяжет ее аргументы, и эти аргументы могут передаваться по ссылке:

var_dump(call_user_func(function($arr) { return reset($arr); },
                        array_values(some_array())));

Однако это на самом деле избыточно, так как call_user_func будет выполнять это временное назначение внутренне. Это позволяет нам рассматривать функции pass-by-reference, как если бы они были пропущенными, без каких-либо предупреждений или ошибок:

var_dump(call_user_func('reset', array_values(some_array())));

Ответ 28

Также стоит иметь в виду контекст, в котором вы это делаете, поскольку исчерпывающая проверка может быть дорогой и не всегда необходимой.

Например, это решение прекрасно работает для ситуации, в которой я его использую (но, очевидно, на него нельзя положиться во всех случаях...)

 /**
 * A quick and dirty way to determine whether the passed in array is associative or not, assuming that either:<br/>
 * <br/>
 * 1) All the keys are strings - i.e. associative<br/>
 * or<br/>
 * 2) All the keys are numeric - i.e. not associative<br/>
 *
 * @param array $objects
 * @return boolean
 */
private function isAssociativeArray(array $objects)
{
    // This isn't true in the general case, but it a close enough (and quick) approximation for the context in
    // which we're using it.

    reset($objects);
    return count($objects) > 0 && is_string(key($objects));
}

Ответ 29

Я предполагаю, что автор просто искал способ получить первый элемент массива после получения его от какой-либо функции (например, mysql_fetch_row) без генерации STRICT "Только переменные должны передаваться по ссылке".

Если это так, то почти все способы, описанные здесь, получат это сообщение... и некоторые из них используют много дополнительной памяти, дублирующей массив (или некоторую его часть). Простой способ избежать этого - просто присвоить значение inline перед вызовом любой из этих функций:

$first_item_of_array = current($tmp_arr = mysql_fetch_row(...));
// or
$first_item_of_array = reset($tmp_arr = func_get_my_huge_array());

Таким образом, вы не получаете сообщение STRICT ни на экране, ни в журналах, ни создаваете дополнительные массивы. Он работает как с индексированными, так и с ассоциативными массивами.

Ответ 30

Мне не нравится возиться с внутренним указателем массива, но также неэффективно создавать второй массив с array_keys() или array_values(), поэтому я обычно определяю это:

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