如何将元素插入到特定位置的数组?
假设我们有两个数组:
$array_1 = array( '0' => 'zero', '1' => 'one', '2' => 'two', '3' => 'three', ); $array_2 = array( 'zero' => '0', 'one' => '1', 'two' => '2', 'three' => '3', );
现在,我想在每个数组的第三个元素之后插入array('sample_key' => 'sample_value')
。 我该怎么做?
$res = array_slice($array, 0, 3, true) + array("my_key" => "my_value") + array_slice($array, 3, count($array)-3, true);
这个例子:
$array = array( 'zero' => '0', 'one' => '1', 'two' => '2', 'three' => '3', ); $res = array_slice($array, 0, 3, true) + array("my_key" => "my_value") + array_slice($array, 3, count($array) - 1, true) ; print_r($res);
得到:
排列 ( [zero] => 0 [one] => 1 [two] => 2 [my_key] => my_value [三] => 3 )
对于你的第一个数组,使用array_splice()
:
$array_1 = array( '0' => 'zero', '1' => 'one', '2' => 'two', '3' => 'three', ); array_splice($array_1, 3, 0, 'more'); print_r($array_1);
输出:
Array( [0] => zero [1] => one [2] => two [3] => more [4] => three )
对于第二个没有秩序,所以你只需要做:
$array_2['more'] = '2.5'; print_r($array_2);
并按任何你想要的键sorting。
function array_insert($arr, $insert, $position) { $i = 0; foreach ($arr as $key => $value) { if ($i == $position) { foreach ($insert as $ikey => $ivalue) { $ret[$ikey] = $ivalue; } } $ret[$key] = $value; $i++; } return $ret; }
看起来不太方便,但它的工作原理。
这是一个你可以使用的简单function。 只需插上即可。
这是按索引插入,而不是按值。
您可以select传递数组,或者使用已经声明的数组。
编辑:较短的版本:
function insert($array, $index, $val) { $size = count($array); //because I am going to use this more than one time if (!is_int($index) || $index < 0 || $index > $size) { return -1; } else { $temp = array_slice($array, 0, $index); $temp[] = $val; return array_merge($temp, array_slice($array, $index, $size)); } }
function insert($array, $index, $val) { //function decleration $temp = array(); // this temp array will hold the value $size = count($array); //because I am going to use this more than one time // Validation -- validate if index value is proper (you can omit this part) if (!is_int($index) || $index < 0 || $index > $size) { echo "Error: Wrong index at Insert. Index: " . $index . " Current Size: " . $size; echo "<br/>"; return false; } //here is the actual insertion code //slice part of the array from 0 to insertion index $temp = array_slice($array, 0, $index);//eg index=5, then slice will result elements [0-4] //add the value at the end of the temp array// at the insertion index eg 5 array_push($temp, $val); //reconnect the remaining part of the array to the current temp $temp = array_merge($temp, array_slice($array, $index, $size)); $array = $temp;//swap// no need for this if you pass the array cuz you can simply return $temp, but, if ur using a class array for example, this is useful. return $array; // you can return $temp instead if you don't use class array }
现在你可以使用testing代码
//1 $result = insert(array(1,2,3,4,5),0, 0); echo "<pre>"; echo "<br/>"; print_r($result); echo "</pre>"; //2 $result = insert(array(1,2,3,4,5),2, "a"); echo "<pre>"; print_r($result); echo "</pre>"; //3 $result = insert(array(1,2,3,4,5) ,4, "b"); echo "<pre>"; print_r($result); echo "</pre>"; //4 $result = insert(array(1,2,3,4,5),5, 6); echo "<pre>"; echo "<br/>"; print_r($result); echo "</pre>";
结果是:
//1 Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 5 ) //2 Array ( [0] => 1 [1] => 2 [2] => a [3] => 3 [4] => 4 [5] => 5 ) //3 Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => b [5] => 5 ) //4 Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5] => 6 )
$list = array( 'Tunisia' => 'Tunis', 'Germany' => 'Berlin', 'Italy' => 'Rom', 'Egypt' => 'Cairo' ); $afterIndex = 2; $newVal= array('Palestine' => 'Jerusalem'); $newList = array_merge(array_slice($list,0,$afterIndex+1), $newVal,array_slice($list,$afterIndex+1));
我最近写了一个函数来做类似于你想要的东西的东西,这和clasvdb的答案类似。
function magic_insert($index,$value,$input_array ) { if (isset($input_array[$index])) { $output_array = array($index=>$value); foreach($input_array as $k=>$v) { if ($k<$index) { $output_array[$k] = $v; } else { if (isset($output_array[$k]) ) { $output_array[$k+1] = $v; } else { $output_array[$k] = $v; } } } } else { $output_array = $input_array; $output_array[$index] = $value; } ksort($output_array); return $output_array; }
基本上它插入在一个特定的点,但避免覆盖所有的项目下移。
如果你不知道你想在位置#3插入它,但是你知道你想要插入它的键 ,我看到这个问题后就制作了这个小函数。
/** * Inserts any number of scalars or arrays at the point * in the haystack immediately after the search key ($needle) was found, * or at the end if the needle is not found or not supplied. * Modifies $haystack in place. * @param array &$haystack the associative array to search. This will be modified by the function * @param string $needle the key to search for * @param mixed $stuff one or more arrays or scalars to be inserted into $haystack * @return int the index at which $needle was found */ function array_insert_after(&$haystack, $needle = '', $stuff){ if (! is_array($haystack) ) return $haystack; $new_array = array(); for ($i = 2; $i < func_num_args(); ++$i){ $arg = func_get_arg($i); if (is_array($arg)) $new_array = array_merge($new_array, $arg); else $new_array[] = $arg; } $i = 0; foreach($haystack as $key => $value){ ++$i; if ($key == $needle) break; } $haystack = array_merge(array_slice($haystack, 0, $i, true), $new_array, array_slice($haystack, $i, null, true)); return $i; }
下面是一个键盘小提琴,看看它在行动: http : //codepad.org/5WlKFKfz
注意:array_splice()会比array_merge(array_slice())高效得多,但是插入数组的键会丢失。 叹。
这个function支持:
- 数字键和关联键
- 在创build密钥之前或之后插入
- 如果没有创build密钥,则追加到数组的末尾
function insert_into_array( $array, $search_key, $insert_key, $insert_value, $insert_after_founded_key = true, $append_if_not_found = false ) { $new_array = array(); foreach( $array as $key => $value ){ // INSERT BEFORE THE CURRENT KEY? // ONLY IF CURRENT KEY IS THE KEY WE ARE SEARCHING FOR, AND WE WANT TO INSERT BEFORE THAT FOUNDED KEY if( $key === $search_key && ! $insert_after_founded_key ) $new_array[ $insert_key ] = $insert_value; // COPY THE CURRENT KEY/VALUE FROM OLD ARRAY TO A NEW ARRAY $new_array[ $key ] = $value; // INSERT AFTER THE CURRENT KEY? // ONLY IF CURRENT KEY IS THE KEY WE ARE SEARCHING FOR, AND WE WANT TO INSERT AFTER THAT FOUNDED KEY if( $key === $search_key && $insert_after_founded_key ) $new_array[ $insert_key ] = $insert_value; } // APPEND IF KEY ISNT FOUNDED if( $append_if_not_found && count( $array ) == count( $new_array ) ) $new_array[ $insert_key ] = $insert_value; return $new_array; }
用法:
$array1 = array( 0 => 'zero', 1 => 'one', 2 => 'two', 3 => 'three', 4 => 'four' ); $array2 = array( 'zero' => '# 0', 'one' => '# 1', 'two' => '# 2', 'three' => '# 3', 'four' => '# 4' ); $array3 = array( 0 => 'zero', 1 => 'one', 64 => '64', 3 => 'three', 4 => 'four' ); // INSERT AFTER WITH NUMERIC KEYS print_r( insert_into_array( $array1, 3, 'three+', 'three+ value') ); // INSERT AFTER WITH ASSOC KEYS print_r( insert_into_array( $array2, 'three', 'three+', 'three+ value') ); // INSERT BEFORE print_r( insert_into_array( $array3, 64, 'before-64', 'before-64 value', false) ); // APPEND IF SEARCH KEY ISNT FOUNDED print_r( insert_into_array( $array3, 'undefined assoc key', 'new key', 'new value', true, true) );
结果:
Array ( [0] => zero [1] => one [2] => two [3] => three [three+] => three+ value [4] => four ) Array ( [zero] => # 0 [one] => # 1 [two] => # 2 [three] => # 3 [three+] => three+ value [four] => # 4 ) Array ( [0] => zero [1] => one [before-64] => before-64 value [64] => 64 [3] => three [4] => four ) Array ( [0] => zero [1] => one [64] => 64 [3] => three [4] => four [new key] => new value )
更清洁的方法(基于使用的stream动性和更less的代码)。
/** * Insert data at position given the target key. * * @param array $array * @param mixed $target_key * @param mixed $insert_key * @param mixed $insert_val * @param bool $insert_after * @param bool $append_on_fail * @param array $out * @return array */ function array_insert( array $array, $target_key, $insert_key, $insert_val = null, $insert_after = true, $append_on_fail = false, $out = []) { foreach ($array as $key => $value) { if ($insert_after) $out[$key] = $value; if ($key == $target_key) $out[$insert_key] = $insert_val; if (!$insert_after) $out[$key] = $value; } if (!isset($array[$target_key]) && $append_on_fail) { $out[$insert_key] = $insert_val; } return $out; }
用法:
$colors = [ 'blue' => 'Blue', 'green' => 'Green', 'orange' => 'Orange', ]; $colors = array_insert($colors, 'blue', 'pink', 'Pink'); die(var_dump($colors));
我刚刚创build了一个ArrayHelper类,这将使数字索引非常容易。
class ArrayHelper { /* Inserts a value at the given position or throws an exception if the position is out of range. This function will push the current values up in index. ex. if you insert at index 1 then the previous value at index 1 will be pushed to index 2 and so on. $pos: The position where the inserted value should be placed. Starts at 0. */ public static function insertValueAtPos(array &$array, $pos, $value) { $maxIndex = count($array)-1; if ($pos === 0) { array_unshift($array, $value); } elseif (($pos > 0) && ($pos <= $maxIndex)) { $firstHalf = array_slice($array, 0, $pos); $secondHalf = array_slice($array, $pos); $array = array_merge($firstHalf, array($value), $secondHalf); } else { throw new IndexOutOfBoundsException(); } } }
例:
$array = array('a', 'b', 'c', 'd', 'e'); $insertValue = 'insert'; \ArrayHelper::insertValueAtPos($array, 3, $insertValue);
开始$ array:
Array ( [0] => a [1] => b [2] => c [3] => d [4] => e )
结果:
Array ( [0] => a [1] => b [2] => c [3] => insert [4] => d [5] => e )
如何将项目插入到某个位置上,这是更好的方法。
function arrayInsert($array, $item, $position) { $begin = array_slice($array, 0, $position); array_push($begin, $item); $end = array_slice($array, $position); $resultArray = array_merge($begin, $end); return $resultArray; }
不像Artefacto的回答那么具体,但是基于他使用array_slice()的build议,我写了下一个函数:
function arrayInsert($target, $byKey, $byOffset, $valuesToInsert, $afterKey) { if (isset($byKey)) { if (is_numeric($byKey)) $byKey = (int)floor($byKey); $offset = 0; foreach ($target as $key => $value) { if ($key === $byKey) break; $offset++; } if ($afterKey) $offset++; } else { $offset = $byOffset; } $targetLength = count($target); $targetA = array_slice($target, 0, $offset, true); $targetB = array_slice($target, $offset, $targetLength, true); return array_merge($targetA, $valuesToInsert, $targetB); }
特征:
- 插入一个或多个值
- 插入键值对(s)
- 在键之前/之后插入,或按偏移量
用法示例:
$target = [ 'banana' => 12, 'potatoe' => 6, 'watermelon' => 8, 'apple' => 7, 2 => 21, 'pear' => 6 ]; // Values must be nested in an array $insertValues = [ 'orange' => 0, 'lemon' => 3, 3 ]; // By key // Third parameter is not applicable // Insert after 2 (before 'pear') var_dump(arrayInsert($target, 2, null, $valuesToInsert, true)); // Insert before 'watermelon' var_dump(arrayInsert($target, 'watermelon', null, $valuesToInsert, false)); // By offset // Second and last parameter are not applicable // Insert in position 2 (zero based ie before 'watermelon') var_dump(arrayInsert($target, null, 2, $valuesToInsert, null));
如果你只是想在一个特定的位置插入一个项目的数组(基于@ clausvdb答案):
function array_insert($arr, $insert, $position) { $i = 0; $ret = array(); foreach ($arr as $key => $value) { if ($i == $position) { $ret[] = $insert; } $ret[] = $value; $i++; } return $ret; }
这是我的版本:
/** * * Insert an element after an index in an array * @param array $array * @param string|int $key * @param mixed $value * @param string|int $offset * @return mixed */ function array_splice_associative($array, $key, $value, $offset) { if (!is_array($array)) { return $array; } if (array_key_exists($key, $array)) { unset($array[$key]); } $return = array(); $inserted = false; foreach ($array as $k => $v) { $return[$k] = $v; if ($k == $offset && !$inserted) { $return[$key] = $value; $inserted = true; } } if (!$inserted) { $return[$key] = $value; } return $return; }
最简单的解决scheme,如果你想在一个特定的键之后插入(一个元素或数组):
function array_splice_after_key($array, $key, $array_to_insert) { $key_pos = array_search($key, array_keys($array)); if($key_pos !== false){ $key_pos++; $second_array = array_splice($array, $key_pos); $array = array_merge($array, $array_to_insert, $second_array); } return $array; }
所以,如果你有:
$array = [ 'one' => 1, 'three' => 3 ]; $array_to_insert = ['two' => 2];
并执行:
$result_array = array_splice_after_key($array, 'one', $array_to_insert);
你会有:
Array ( ['one'] => 1 ['two'] => 2 ['three'] => 3 )