Подтвердить что ты не робот

Вычисление ключа и значения из ассоциативного массива в PHP

Пусть S - ассоциативный массив в PHP, мне нужно извлечь и извлечь из него первый элемент, как значение, так и ключ.

Я бы использовал

value1=array_pop(S);

но это только дает мне значение.

Я могу использовать

K=array_keys(S);
key1=array_pop(K);
value1=array_pop(S);

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

4b9b3361

Ответ 1

$value = reset($arr);
$key = key($arr);

(в этом порядке)

См. reset() Руководство по PHP, key() Руководство по PHP.

unset($arr[$key]); # in case you want to remove it.

Однако array_pop() Руководство по PHP работает с последним элементом:

$value = end($arr);
$key = key($arr);
unset($arr[$key]); # in case you want to remove it.

См. end() Руководство по PHP.

Для развлечения:

list($value, $key) = array(end($arr), key($arr));

или

extract(array('value'=>end($arr), 'key'=>key($arr)));

или

end($arr);
list($key, $value) = each($arr);

или любой другой стиль игры, который вам нравится;)

Работа с пустыми массивами

До сих пор не хватало информации о пустых массивах. Поэтому нужно проверить, есть ли последний (первый) элемент, а если нет, установите $key в null (поскольку null не может быть ключом массива):

for($key=null;$key===null&&false!==$value=end($arr);)
    unset($arr[$key=key($arr)]);

Это даст для заполненного массива, такого как $arr = array('first' => '1st', 'last' => '2nd.');:

string(4) "2nd." # value
string(4) "last" # key
array(1) { # leftover array
  ["first"]=>
  string(3) "1st"
}

И пустой массив:

bool(false) # value
NULL # key
array(0) { # leftover array
}

Боитесь использовать unset?

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

end($arr);
$key = key($arr);
$value = array_pop($arr);

Ответ 2

array_slice

$arr = array('k1' => 'v1', 'k2' => 'v2', 'k3' => 'v3');

$a = array_slice($arr, 0, 1);
var_dump($a);

$arr = array_slice($arr, 1);
var_dump($arr);


array(1) {
  ["k1"]=>
  string(2) "v1"
}
array(2) {
  ["k2"]=>
  string(2) "v2"
  ["k3"]=>
  string(2) "v3"
}

Ответ 3

$value = reset($array);
$key = key($array);

Изменить: Хакре просто избил меня: -)

Ответ 4

list($value, $key) = array(reset($s), key($s));
array_shift($s); // or just unset($s[$key]);

Конечно, вы можете разбить первый оператор на два отдельных.