it-swarm.com.ru

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

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

array( 4 => 'Apple', 7 => 'orange', 13 => 'Plum' )

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

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

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

919
hsz

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

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

$arr = array( 4 => 'Apple', 7 => 'orange', 13 => 'Plum' )
echo reset($arr); //echoes "Apple"

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

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

From документация PHP :

смешанныйreset (массив & $ array);

Описание:

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

742
lepe
$first_value = reset($array); // First Element's Value
$first_key = key($array); // First Element's Key

Надеюсь это поможет. :)

254
Ijas Ameenudeen
$arr = array( 9 => 'Apple', 7 => 'orange', 13 => 'Plum' );
echo reset($arr); // echoes 'Apple'

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

88
yoda

current($array)

может получить первый элемент массива, согласно PHP Manual

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

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

69
Tofeeq

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

// 1st item
list($firstItem) = $yourArray;

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

// 2nd item
list( , $secondItem) = $yourArray;

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

list($firstKey) = array_keys($yourArray);
list(, $secondKey) = array_keys($yourArray);
63
Sergiy Sokolenko

PHP 5.4+:

array_values($array)[0];
52
Samer Ata

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

$array = array( 4 => 'Apple', 7 => 'orange', 13 => 'Plum' );

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

$array[key($array)]

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

key($array)

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

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

27
Lucas

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

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) ];
14
Alex Shesterov

Просто сделайте:

array_shift(array_slice($array,0,1));
13
DiverseAndRemote.com

От Ларавеллы помощники :

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
Gras Double

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

11
user1485518
$myArray = array (4 => 'Apple', 7 => 'orange', 13 => 'Plum');
$arrayKeys = array_keys($myArray);

// the first element of your array is:
echo $myArray[$arrayKeys[0]];  
10
Jacob Topping
$array=array( 4 => 'Apple', 7 => 'orange', 13 => 'Plum' );

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

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

Для получения дополнительной информации см. http://www.php.net/manual/en/function.each.php

9
rustyx
$arr = array( 4 => 'Apple', 7 => 'orange', 13 => 'Plum' );
foreach($arr as $first) break;
echo $first;

Результат:

Apple
9
tekin

Клудгый способ это:

$foo = array( 4 => 'Apple', 7 => 'orange', 13 => 'Plum' );

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

print get_first($foo);
8
William Macdonald

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

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

Хотя это работает, и прилично хорошо, пожалуйста, смотрите мой дополнительный ответ: https://stackoverflow.com/a/48410351/1804013

7
tfont

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

array_values($arr)[0]

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

array_reverse($arr)[0]
6
Adobe

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

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

5
tfont

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

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

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

4
Bazi

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

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

4
Chris Kempen

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

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

<?php
// get 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 an reset in
// just to make sure that the array pointer is at first element
// also reset return the first element
// reset($myArray);

// return first key 
$firstKey = key($array); 

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

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

echo $array[array_keys($array)[0]];
4
Jens A. Koch

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

4
jmking

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

$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

2
Steven Koch

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

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

 /**
 * 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's 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));
}
1
Dan King

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

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

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

1
dmikam

Попробуй это:

$fruits = array( 4 => 'Apple', 7 => 'orange', 13 => 'Plum' );
echo reset($fruits)."\n";

1
Wakar Ahmad Khan

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

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

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

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

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

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

Если мы будем использовать анонимные функции, подобные этой, мы сможем избежать перезагрузки и 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())));
1
Warbo

Никто не предложил использовать класс ArrayIterator:

$array = array( 4 => 'Apple', 7 => 'orange', 13 => 'Plum' );
$first_element = (new ArrayIterator($array))->current();
echo $first_element; //'Apple'

обходит по ссылочному условию ФП.

0
pgee70

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

Когда решение arr[0]:

(Обратите внимание, что, поскольку массив с ключами имеет индекс на основе 0, 1-й элемент Имеет индекс 0)

Вы можете использовать переменную и затем вычесть ее, чтобы получить свою логику, которая 1 => 'Apple'.

$i = 1;
$arr = array( 4 => 'Apple', 7 => 'orange', 13 => 'Plum' );
echo $arr[array_keys($arr)[$i-1]];

Результат:

Apple

Ну, для простоты - просто используйте:

$arr = array( 4 => 'Apple', 7 => 'orange', 13 => 'Plum' );
echo $arr[array_keys($arr)[0]];

Результат:

Apple

Первым методом не только первый элемент, но и можно рассматривать ассоциативный массив как индексированный массив.

0
Ataboy Josef

Хороший с комбинацией array_slice и implode:

$arr = array(1, 2, 3);
echo implode(array_slice($arr, 0, 1));
// Outputs 1

/*---------------------------------*/

$arr = array(
    'key_1' => 'One',
    'key_2' => 'Two',
    'key_3' => 'Three',
);
echo implode(array_slice($arr, 0, 1));
// Outputs One
0
Nabil Kadimi

вы можете получить первый элемент, используя эту кодировку

$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;
0
karthikeyan ganesan