Я пытаюсь что-то сделать, но я не могу найти какое-либо решение, у меня также возникают проблемы с его работой, поэтому здесь приведен пример кода, возможно, этого будет достаточно, чтобы продемонстрировать, на что я нацелен:
$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()
но это бессмысленно, так как он вернет ассоциативный индекс ….
Как определить численное смещение ассоциативного индекса?
Просто захват и 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++; }