PHP: Как добавить элемент массива после указанного элемента?

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

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

Примеры

Ассоциативный массив

Вставим по порядковому номеру

Добавим элемент после указанного по счету элемента. В примере после второго элемента:

$array = [
	'one'   => 'one value',
	'two'   => 'two value',
	'three' => 'three value',
];

$array = array_slice( $array, 0, 2 ) + [ 'newKey' => 'newValue' ] + $array;

print_r( $array );

/*
Array (
	[one]    => one value
	[two]    => two value
	[newKey] => newValue
	[three]  => three value
)
*/

Вставим после указанного ключа (по названию ключа)

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

$array = [
	'one'   => 'one value',
	'two'   => 'two value',
	'three' => 'three value',
];

$after_key = 'two';

$index = array_search( $after_key, array_keys( $array ) );

$array = array_slice( $array, 0, $index + 1 ) + [ 'newKey' => 'newValue' ] + $array;

print_r( $array );

/*
Array(
	[one] => one value
	[two] => two value
	[newKey] => newValue
	[three] => three value
)
*/

Индексированный массив

$array = [
	'one',
	'two',
	'three',
];

$array = array_merge(
	array_slice( $array, 0, 2 ),
	[ 'newValue' ],
	array_slice( $array, 2 )
);

print_r( $array );
/*
Array (
	[0] => one
	[1] => two
	[2] => newValue
	[3] => three
)
*/

Универсальная функция

Для решения предлагаю универсальную функцию:

/**
 * Inserts an array after a specified key in another array.
 *
 * This function searches for the specified key in the provided array. If the key is found,
 * it inserts the given array immediately after that key. If the key is not found, the given
 * array is appended to the end of the original array.
 *
 * @param array   $array         The original array to modify.
 * @param mixed   $key           The key after which the new array should be inserted.
 * @param array   $insert_array  The array to insert into the original array.
 *
 * @return void
 */
function array_insert_after_key( & $array, $key, $insert_array ) {

	$index = array_search( $key, array_keys( $array ) );

	// key is not found, add to the end of the array
	if( $index === false ){
		$array = array_merge( $array, $insert_array );
	}
	// split the array into two parts and insert a new element between them
	else{
		$array = array_merge(
			array_slice( $array, 0, $index + 1, true ),
			$insert_array,
			array_slice( $array, $index + 1, null, true )
		);
	}
}

Примеры использования

Ассоциативный массив

Примеры 1:

$array = [
	'a' => 1,
	'b' => 2,
	'c' => 3
];

array_insert_after_key( $array, 'b', [ 'newKey' => 'newValue' ] );

print_r( $array );
/*
Array (
	[a] => 1
	[b] => 2
	[newKey] => newValue
	[c] => 3
)
*/

Пример 2:

$array = [
	'a' => 1,
	'b' => 2,
	'c' => 3
];

$inset_array = [
	'newKey'  => 'newValue',
	'newKey2' => 'newValue2',
];

array_insert_after_key( $array, 'b', $inset_array );

print_r( $array );

/*
Array (
	[a] => 1
	[b] => 2
	[newKey] => newValue
	[newKey2] => newValue2
	[c] => 3
)
*/

Индексированный массив

Пример 1:

$array1 = [
	1,
	2,
	3,
];

array_insert_after_key( $array1, 1, [ 'newValue' ] );

print_r( $array1 );

/*
Array (
	[0] => 1
	[1] => 2
	[2] => newValue
	[3] => 3
)
*/

Пример 2:

$array1 = [
	1,
	2,
	3,
];

array_insert_after_key( $array1, 1, [ 'newValue', 'newValue2' ] );

print_r( $array1 );

/*
Array (
	[0] => 1
	[1] => 2
	[2] => newValue
	[3] => newValue2
	[4] => 3
)
*/

--