array_splice () – Числовые смещения ассоциативных массивов

Я пытаюсь что-то сделать, но я не могу найти какое-либо решение, у меня также возникают проблемы с его работой, поэтому здесь приведен пример кода, возможно, этого будет достаточно, чтобы продемонстрировать, на что я нацелен:

$input = array ( 'who' => 'me', 'what' => 'car', 'more' => 'car', 'when' => 'today', ); 

Теперь я хочу использовать array_splice() для удаления (и возврата) одного элемента из массива:

 $spliced = key(array_splice($input, 2, 1)); // I'm only interested in the key... 

Вышеупомянутое будет удалять и возвращать 1 элемент (третий аргумент) из $input (первый аргумент), при смещении 2 (второй аргумент), поэтому $spliced будет удерживать значение more .

Я буду перебирать через $input с циклом foreach, я знаю ключ для сращивания, но проблема в том, что я не знаю его числового смещения, и поскольку array_splice принимает только целые числа, я не знаю, что делать.

Очень скучный пример:

 $result = array(); foreach ($input as $key => $value) { if ($key == 'more') { // Remove the index "more" from $input and add it to $result. $result[] = key(array_splice($input, 2 /* How do I know its 2? */, 1)); } } 

Сначала я использую array_search() но это бессмысленно, так как он вернет ассоциативный индекс ….

Как определить численное смещение ассоциативного индекса?

Solutions Collecting From Web of "array_splice () – Числовые смещения ассоциативных массивов"

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

 $result = array(); $idx = 0; // init offset foreach ($input as $key => $value) { if ($key == 'more') { // Remove the index "more" from $input and add it to $result. $result[] = key(array_splice($input, $idx, 1)); } $idx++; // count offset } print_R($result); print_R($input); 

дает

 Array ( [0] => more ) Array ( [who] => me [what] => car [when] => today ) 

НО Технически говоря, ассоциативный ключ не имеет численного индекса. Если входной массив был

 $input = array ( 'who' => 'me', 'what' => 'car', 'more' => 'car', 'when' => 'today', 'foo', 'bar', 'baz' ); 

то индекс 2 является «баз». Но так как array_slice принимает смещение , которое не совпадает с числовым ключом, оно использует элемент, найденный в этой позиции в массиве (для того, чтобы появлялись элементы), поэтому подсчитывать по работам.

На стороне, с числовыми ключами в массиве, вы получите забавные результаты, потому что вы проверяете равенство вместо идентичности. Сделайте это $key === 'more' вместо того, чтобы предотвратить «больше» получения typecasted. Поскольку ассоциативные ключи уникальны, вы также можете вернуться после того, как было найдено «больше», потому что проверка последующих ключей бессмысленна. Но действительно:

 if(array_key_exists('more', $input)) unset($input['more']); 

Я нашел решение:

 $offset = array_search('more', array_keys($input)); // 2 

Даже с «смешными» массивами, такими как:

 $input = array ( 'who' => 'me', 'what' => 'car', 'more' => 'car', 'when' => 'today', 'foo', 'bar', 'baz' ); 

Эта:

 echo '<pre>'; print_r(array_keys($input)); echo '</pre>'; 

Правильно выводит это:

 Array ( [0] => who [1] => what [2] => more [3] => when [4] => 0 [5] => 1 [6] => 2 ) 

Это тривиальное решение, но несколько неясное, чтобы добраться туда.

Я ценю всю помощь от всех. знак равно

 $i = 0; foreach ($input as $key => $value) { if ($key == 'more') { // Remove the index "more" from $input and add it to $result. $result[] = key(array_splice($input, $i , 1)); } $i++; }