Я искал и думал, но не могу найти жизнеспособного решения этой проблемы.
У меня есть массив с секвенциальными числовыми ключами
Пример:
Array ( [0] => value 0 [1] => value 1 [2] => value 2 [3] => value 3 )
Мне нужно добавить новую пару ключ / значение между двумя конкретными ключами в моем массиве.
Пример:
Мне нужно добавить [a] => value a
между клавишами 1
и 2
как
Array ( [0] => value 0 [1] => value 1 [a] => value a [2] => value 2 [3] => value 3 )
То, что я уже делал, но кажется длинным
нарезая мой массив пополам, добавьте пару ключ / значение в конец среза и рекомбинируем мои 2 среза в один массив
каким-то образом продвигая каждый ключ на один после нажатия клавиши 1
меняя мою новую пару ключ / значение на [2] => value a
, добавьте ее в конец массива, а затем прибегните к моему массиву
Любые предложения по быстрому чистному способу достижения этого
Не знаю, почему вы это сделаете …
$array = array(0=>0,1=>1,2=>2,3=>3); $add = array('a'=>'a'); $before_key = 2; $new_array = array(); foreach($array as $key=>$val) { if($key===$before_key) { $new_array[key($add)] = $add[key($add)]; } $new_array[$key] = $val; } $array = $new_array; var_dump($array);
Я предполагаю, что исходный массив может быть ассоциативным …
$ar = array ( '0' => 'value 0', '1' => 'value 1', '2' => 'value 2', '3' => 'value 3', ); var_dump(insertAfter($ar, '1', array('a' => 'a'))); function insertAfter($arr, $key, $piece) { $keys = array_keys($arr); $index = array_search($key, $keys); if ($index !== false) $ar = array_merge( array_slice($arr, 0, $index + 1, true), $piece, array_slice($arr, $index + 1, null, true)); return $ar; }
Результат:
array(5) { [0]=> string(7) "value 0" [1]=> string(7) "value 1" ["a"]=> string(1) "a" [2]=> string(7) "value 2" [3]=> string(7) "value 3" }
ps: исправлено для ключей, но если в сохранении ключей нет необходимости,
function insertAfter($arr, $key, $piece) { $before = array(); $keys = array_keys($arr); $index = array_search($key, $keys); if ($index !== false) $before = array_splice($arr, 0, $index + 1, $piece); return array_merge($before, $arr); }
Вот мой псевдокод моего подхода (это написано на питоне, но концепция все еще существует)
for key, item in enumerate(array): if key == 2: thirdKey = array[key] array[1] = a if key == 3: fourthKey = array[key] array[2] = thirdKey if key == 4: array[3] = fourthKey
Вид длинного подхода, но я надеюсь, что это поможет 🙂