在PHP中的任何位置插入新的项目

我怎样才能插入一个新的项目在任何位置的数组,例如在数组的中间?

你可能会发现这更直观一些。 它只需要一个函数调用array_splice

 $original = array( 'a', 'b', 'c', 'd', 'e' ); $inserted = array( 'x' ); // Not necessarily an array array_splice( $original, 3, 0, $inserted ); // splice in at position 3 // $original is now abcxde 

可以在整数和string位置插入的函数:

 /** * @param array $array * @param int|string $position * @param mixed $insert */ function array_insert(&$array, $position, $insert) { if (is_int($position)) { array_splice($array, $position, 0, $insert); } else { $pos = array_search($position, array_keys($array)); $array = array_merge( array_slice($array, 0, $pos), $insert, array_slice($array, $pos) ); } } 

整数用法:

 $arr = ["one", "two", "three"]; array_insert( $arr, 1, "one-half" ); // -> array ( 0 => 'one', 1 => 'one-half', 2 => 'two', 3 => 'three', ) 

string用法:

 $arr = [ "name" => [ "type" => "string", "maxlength" => "30", ], "email" => [ "type" => "email", "maxlength" => "150", ], ]; array_insert( $arr, "email", [ "phone" => [ "type" => "string", "format" => "phone", ], ] ); // -> array ( 'name' => array ( 'type' => 'string', 'maxlength' => '30', ), 'phone' => array ( 'type' => 'string', 'format' => 'phone', ), 'email' => array ( 'type' => 'email', 'maxlength' => '150', ), ) 
 $a = array(1, 2, 3, 4); $b = array_merge(array_slice($a, 0, 2), array(5), array_slice($a, 2)); // $b = array(1, 2, 5, 3, 4) 

这样你可以插入数组:

 function array_insert(&$array, $value, $index) { return $array = array_merge(array_splice($array, max(0, $index - 1)), array($value), $array); } 

没有原生的PHP函数(我知道)可以完全按照您的要求进行操作。

我写了两种我认为适合的方法:

 function insertBefore($input, $index, $element) { if (!array_key_exists($index, $input)) { throw new Exception("Index not found"); } $tmpArray = array(); $originalIndex = 0; foreach ($input as $key => $value) { if ($key === $index) { $tmpArray[] = $element; break; } $tmpArray[$key] = $value; $originalIndex++; } array_splice($input, 0, $originalIndex, $tmpArray); return $input; } function insertAfter($input, $index, $element) { if (!array_key_exists($index, $input)) { throw new Exception("Index not found"); } $tmpArray = array(); $originalIndex = 0; foreach ($input as $key => $value) { $tmpArray[$key] = $value; $originalIndex++; if ($key === $index) { $tmpArray[] = $element; break; } } array_splice($input, 0, $originalIndex, $tmpArray); return $input; } 

虽然速度更快,可能还有更高的内存使用效率,但只有在不需要维护arrays密钥的情况下才能真正适用。

如果您确实需要维护密钥,以下将更合适;

 function insertBefore($input, $index, $newKey, $element) { if (!array_key_exists($index, $input)) { throw new Exception("Index not found"); } $tmpArray = array(); foreach ($input as $key => $value) { if ($key === $index) { $tmpArray[$newKey] = $element; } $tmpArray[$key] = $value; } return $input; } function insertAfter($input, $index, $newKey, $element) { if (!array_key_exists($index, $input)) { throw new Exception("Index not found"); } $tmpArray = array(); foreach ($input as $key => $value) { $tmpArray[$key] = $value; if ($key === $index) { $tmpArray[$newKey] = $element; } } return $tmpArray; } 

你可以使用这个

 foreach ($array as $key => $value) { if($key==1) { $new_array[]=$other_array; } $new_array[]=$value; } 

通常情况下,标量值:

 $elements = array('foo', ...); array_splice($array, $position, $length, $elements); 

要将单个数组元素插入到数组中,请不要忘记将数组包装在数组中(因为这是一个标量值):

 $element = array('key1'=>'value1'); $elements = array($element); array_splice($array, $position, $length, $elements); 

否则数组中的所有按键都将被逐一添加。

 function insert(&$arr, $value, $index){ $lengh = count($arr); if($index<0||$index>$lengh) return; for($i=$lengh; $i>$index; $i--){ $arr[$i] = $arr[$i-1]; } $arr[$index] = $value; } 

提示在数组的开头添加一个元素:

 $a = array('first', 'second'); $a[-1] = 'i am the new first element'; 

然后:

 foreach($a as $aelem) echo $a . ' '; //returns first, second, i am... 

但:

 for ($i = -1; $i < count($a)-1; $i++) echo $a . ' '; //returns i am as 1st element 

这也是一个可行的解决scheme:

 function array_insert(&$array,$element,$position=null) { if (count($array) == 0) { $array[] = $element; } elseif (is_numeric($position) && $position < 0) { if((count($array)+position) < 0) { $array = array_insert($array,$element,0); } else { $array[count($array)+$position] = $element; } } elseif (is_numeric($position) && isset($array[$position])) { $part1 = array_slice($array,0,$position,true); $part2 = array_slice($array,$position,null,true); $array = array_merge($part1,array($position=>$element),$part2); foreach($array as $key=>$item) { if (is_null($item)) { unset($array[$key]); } } } elseif (is_null($position)) { $array[] = $element; } elseif (!isset($array[$position])) { $array[$position] = $element; } $array = array_merge($array); return $array; } 

学分转到: http : //binarykitten.com/php/52-php-insert-element-and-shift.html

基于@Halil伟大的答案,这里是一个简单的函数如何在一个特定的键后插入新的元素,同时保留整数键:

 private function arrayInsertAfterKey($array, $afterKey, $key, $value){ $pos = array_search($afterKey, array_keys($array)); return array_merge( array_slice($array, 0, $pos, $preserve_keys = true), array($key=>$value), array_slice($array, $pos, $preserve_keys = true) ); } 

如果不确定,那么不要使用这些

 $arr1 = $arr1 + $arr2; 

要么

 $arr1 += $arr2; 

因为+原始数组将被覆盖。 ( 见来源 )

试试这个:

 $colors = array('red', 'blue', 'yellow'); $colors = insertElementToArray($colors, 'green', 2); function insertElementToArray($arr = array(), $element = null, $index = 0) { if ($element == null) { return $arr; } $arrLength = count($arr); $j = $arrLength - 1; while ($j >= $index) { $arr[$j+1] = $arr[$j]; $j--; } $arr[$index] = $element; return $arr; } 

jay.lee的解决scheme是完美的。 如果要将项目添加到multidimensional array中,请首先添加一个单维数组,然后将其replace。

 $original = ( [0] => Array ( [title] => Speed [width] => 14 ) [1] => Array ( [title] => Date [width] => 18 ) [2] => Array ( [title] => Pineapple [width] => 30 ) ) 

将相同格式的项目添加到此数组中将会将所有新的数组索引作为项目添加,而不仅仅是项目。

 $new = array( 'title' => 'Time', 'width' => 10 ); array_splice($original,1,0,array('random_string')); // can be more items $original[1] = $new; // replaced with actual item 

注意:使用array_splice将项目直接添加到multidimensional array将会将其所有索引作为项目添加,而不仅仅是该项目。

使用string键将元素插入到数组中,可以这样做:

 /* insert an element after given array key * $src = array() array to work with * $ins = array() to insert in key=>array format * $pos = key that $ins will be inserted after */ function array_insert_string_keys($src,$ins,$pos) { $counter=1; foreach($src as $key=>$s){ if($key==$pos){ break; } $counter++; } $array_head = array_slice($src,0,$counter); $array_tail = array_slice($src,$counter); $src = array_merge($array_head, $ins); $src = array_merge($src, $array_tail); return($src); }