How to insert element into arrays at specific position?
假设我们有两个数组:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
现在,我想在每个数组的第三个元素后面插入
1 2 3 | $res = array_slice($array, 0, 3, true) + array("my_key" =>"my_value") + array_slice($array, 3, count($array)-3, true); |
这个例子:
1 2 3 4 5 6 7 8 9 10 | $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); |
好的:
1 2 3 4 5 6 7 8 |
是你的第一个阵列,使用
1 2 3 4 5 6 7 8 9 | $array_1 = array( '0' => 'zero', '1' => 'one', '2' => 'two', '3' => 'three', ); array_splice($array_1, 3, 0, 'more'); print_r($array_1); |
输出:
1 2 3 4 5 6 7 |
在一个有一个是第二阶,那么你就要:
1 2 |
无论你做什么和想要的键进行排序。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | function insertValueAtPosition($arr, $insertedArray, $position) { $i = 0; $new_array=[]; foreach ($arr as $key => $value) { if ($i == $position) { foreach ($insertedArray as $ikey => $ivalue) { $new_array[$ikey] = $ivalue; } } $new_array[$key] = $value; $i++; } return $new_array; } |
例子:
1 2 3 4 5 | $array = ["A"=8,"K"=>3]; $insert_array = ["D"= 9]; insertValueAtPosition($array, $insert_array, $position=2); // result ====> ["A"=>8, "D"=>9, "K"=>3]; |
看起来真的很可能不是完美的,但它的作品。
这是简单的函数,你可以使用。"即插即用。
这是通过不通过插入索引值。
你可以选择通过使用一个阵列,或符合你已经拥有的。
编辑:较短的版本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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)); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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);//e.g index=5, then slice will result elements [0-4] //add the value at the end of the temp array// at the insertion index e.g 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 u r using a class array for example, this is useful. return $array; // you can return $temp instead if you don't use class array } |
现在你可以测试使用的代码
1 2 3 4 5 6 |
";//2结果=(元阵列(2,3,4,5),插入"2");回声"
1 2 3 | "; print_r($result); echo" |
";//3结果=(元阵列(2,3,4,5),刀片4,"b");回声"
1 2 3 | "; print_r($result); echo" |
";//4结果=(元阵列(2,3,4,5),插入(5,6);回声"
1 2 3 4 | "; echo"<br/>"; print_r($result); echo" |
";<><>//码前
and the result is:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
1 2 3 4 5 6 7 8 9 10 | $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)); |
该功能支持:
- 这两个数字与相关的钥匙
- 插入前或后成立的关键
- 添加到数组的结束,如果密钥是不是成立
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 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; } |
用法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | $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) ); |
结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | 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 ) |
我最近写的一些功能类似于什么样的声音,你是attempting,这是类似的方法来回答clasvdb’s。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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; } |
基本上,它在特定的插入点,但对所有的项目avoids重写移下来。
如果你不知道你在想# 3插入它的位置,但你知道你想插入的关键是正确的平衡后,我看到这个小功能启动后这个问题。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | /** * 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; } |
这是在行动中看到它codepad小提琴:http:///5wlkfkfz codepad.org
注意:阵列_ splice()就已经比很多更有效的_合并数组(阵列)层(_)然后插入数组的键,你将已丢失。叹息。
清洁的方法和基于无流动使用的代码)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | /** * 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; } |
用法:
1 2 3 4 5 6 7 8 9 |
简的解决方案,如果你想插入一个元素或阵列)在某些重点:
1 2 3 4 5 6 7 8 9 10 | 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; } |
所以,如果你有:
1 2 3 4 5 | $array = [ 'one' => 1, 'three' => 3 ]; $array_to_insert = ['two' => 2]; |
和运行:
1 | $result_array = array_splice_after_key($array, 'one', $array_to_insert); |
你必须:
1 2 3 4 5 |
答案很简单:你的问题2。
1 2 3 4 5 6 |
你把你的插入在第一和第三元件的阵列,然后assign _剪接本元价值:
1 2 |
我只是创造了一arrayhelper这将使这类数字指标是很容易的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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(); } } } |
例子:
1 2 3 | $array = array('a', 'b', 'c', 'd', 'e'); $insertValue = 'insert'; \ArrayHelper::insertValueAtPos($array, 3, $insertValue); |
开始的数组:
1 2 3 4 5 6 7 |
结果:
1 2 3 4 5 6 7 8 |
我需要的东西可以在一插入,替换后,该键;或在启动和加载端的阵列目标的关键,如果是没有发现。默认的是插入后的关键。
新功能
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | /** * Insert element into an array at a specific key. * * @param array $input_array * The original array. * @param array $insert * The element that is getting inserted; array(key => value). * @param string $target_key * The key name. * @param int $location * 1 is after, 0 is replace, -1 is before. * * @return array * The new array with the element merged in. */ function insert_into_array_at_key(array $input_array, array $insert, $target_key, $location = 1) { $output = array(); $new_value = reset($insert); $new_key = key($insert); foreach ($input_array as $key => $value) { if ($key === $target_key) { // Insert before. if ($location == -1) { $output[$new_key] = $new_value; $output[$key] = $value; } // Replace. if ($location == 0) { $output[$new_key] = $new_value; } // After. if ($location == 1) { $output[$key] = $value; $output[$new_key] = $new_value; } } else { // Pick next key if there is an number collision. if (is_numeric($key)) { while (isset($output[$key])) { $key++; } } $output[$key] = $value; } } // Add to array if not found. if (!isset($output[$new_key])) { // Before everything. if ($location == -1) { $output = $insert + $output; } // After everything. if ($location == 1) { $output[$new_key] = $new_value; } } return $output; } |
输入代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | $array_1 = array( '0' => 'zero', '1' => 'one', '2' => 'two', '3' => 'three', ); $array_2 = array( 'zero' => '0', 'one' => '1', 'two' => '2', 'three' => '3', ); $array_1 = insert_into_array_at_key($array_1, array('sample_key' => 'sample_value'), 2, 1); print_r($array_1); $array_2 = insert_into_array_at_key($array_2, array('sample_key' => 'sample_value'), 'two', 1); print_r($array_2); |
输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
利用_剪接阵列阵列,使一个_层而不调用的函数。
1 2 3 4 5 6 7 8 9 | $toto = array( 'zero' => '0', 'one' => '1', 'two' => '2', 'three' => '3' ); $ret = array_splice($toto, 3 ); $toto = $toto + array("my_key" =>"my_value") + $ret; print_r($toto); |
这项技术是更好的方法插入到阵列的在线部分的位置。
1 2 3 4 5 6 7 8 | 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; } |
你只是在盒插入到一个项目,到一定的位置,在一个数组(答案:基于"clausvdb)
1 2 3 4 5 6 7 8 9 10 11 12 | 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; } |
这里是我的版本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | /** * * 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; } |
的答案是:混凝土的神器,但在他的建议使用基于阵列的_(slice(),我写的下一个函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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); } |
特点:
- 插入一个或múltiple值
- 插入的关键值对(S)
- 前/后的关键插入,或由偏置
的使用实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | $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 i.e. before 'watermelon') var_dump(arrayInsert($target, null, 2, $valuesToInsert, null)); |
我这么做的
1 | $slightly_damaged = array_merge(array_slice($slightly_damaged, 0, 4, true) + array("4" =>"0.0"), array_slice($slightly_damaged, 4, count($slightly_damaged)-4, true)); |
关于。