如何将元素插入到特定位置的数组中?

Posted

技术标签:

【中文标题】如何将元素插入到特定位置的数组中?【英文标题】:How to insert element into arrays at specific position? 【发布时间】:2011-03-22 04:35:07 【问题描述】:

假设我们有两个数组:

$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')。我该怎么做?

【问题讨论】:

Insert new item in array on any position in php的可能重复 不是重复这个问题更侧重于 assoc 数组,@KashyapKotak 【参考方案1】:

代码:

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;

示例:

$array        = ["A"=8, "K"=>3];
$insert_array = ["D"= 9];

insertValueAtPosition($array, $insert_array, $position=2);
// result ====> ["A"=>8,  "D"=>9,  "K"=>3];

可能看起来并不完美,但它确实有效。

【讨论】:

你基本上是在做拼接,不要重新发明***。 不,他不是在重新发明***。 array_splice() 不允许放置键和值。仅以特定位置为键的值。 是的,但如前所述,array_splice 不支持关联数组。我很乐意看到更优雅的方法。 你的函数非常好,但是当位置大于数组长度时它不能正常工作(尝试执行这个 array_insert($array_2, array("wow" => "wow"), 4) )。但它可以很容易地修复。你的回答很好,你已经回答了我的问题!【参考方案2】:

对于您的第一个数组,使用 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);

然后按你想要的任何方式对键进行排序。

【讨论】:

第二个数组确实有顺序...所有数组都有,因为它们也是双链表。 -1,如前所述“没有订单”是假的。此外,array_splice 破坏了第一个示例中的键/值关联(但可能是 OP 的意图)。 PHP 中的 @Artefacto "Arrays" 实际上是有序哈希表。 PHP 数组的行为类似于数组,但它们从来都不是真正的数组。它们也不是链表,也不是数组列表。 5小时后我终于看到了一个我明白的答案,谢谢!还有一点需要注意的是,如果有人推送关联数组,他们还可以将“数组”指定为 array_splice 中的第四个参数。就像这样:array_splice($array_1, 3, 0, ARRAY($array_name_to_insert)); @FrederikKrautwald 自 PHP 7 以来,该声明不正确。 PHP 7 使用两个数组来实现其哈希表 + 有序列表。这是一篇来自 PHP 核心开发者 (Nikic) 的文章:nikic.github.io/2014/12/22/…【参考方案3】:

我最近写了一个函数来做一些类似于你正在尝试的事情,它与 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;

基本上它在特定点插入,但通过向下移动所有项目来避免覆盖。

【讨论】:

试试这个 magic_insert(3, array("wow" => "wow"), $array_2);从问题文本中获取 $array_2。 我不希望这会起作用,因为 $array_2 是关联的,并且位置的概念在这种情况下通常不相关。【参考方案4】:

array_slice()可以用来提取数组的部分,联合array operator (+)可以重新组合部分。

$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);

给予:

大批 ( [零] => 0 [一] => 1 [二] => 2 [my_key] => my_value [三] => 3 )

【讨论】:

您应该按照 M42 的建议使用 array_splice()。它只用一行代码就解决了问题。 + 不应该被使用!请改用array_merge!因为如果索引是整数(普通数组,而不是哈希),+ 将无法按预期工作!!! @Tomas 是否按预期工作取决于您的期望。 array_merge 对数字键的行为不适合这个问题。 您可以简单地将 null 指定为相同的效果,而不是使用 count($array)-3。此外,按照 TMS 的建议使用 array_merge 不需要您使用唯一索引。示例:将“新值”添加到现有数组:$b = array_merge( array_slice( $a, 0, 1, true ), array( 'new-value' ), array_slice( $a, 1, null, true ) ); +array_merge 之间似乎有些混淆。如果您想将内容插入数字数组,则不应使用+,因为它可能与您的期望不符。但是你也不应该使用array_merge;对于数值数组,整个问题都可以通过 array_splice 函数解决。对于关联数组或混合数组,您可能不希望重新索引数字键,因此使用 + 是完全合适的。【参考方案5】:

如果你不知道你想在#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()) 更有效,但是插入数组的键会丢失。叹息。

【讨论】:

【参考方案6】:

这是一个您可以使用的简单函数。即插即用。

这是按索引插入,而不是按值插入。

您可以选择传递数组,或者使用您已经声明的数组。

更新、更短的版本:

   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);//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
$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
)

【讨论】:

【参考方案7】:
$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));

【讨论】:

提一下:现在可以在数组之间使用 + 来代替 array_merge @roelleor 但请注意:“如果输入数组具有相同的字符串键,则该键的后一个值将覆盖前一个。但是,如果数组包含数字键,则后一个value 不会覆盖原始值,但会被追加。” - array_merge 谢谢!考虑到关联数组,这是唯一对我有用的答案【参考方案8】:

此功能支持:

数字键和关联键 在创建的密钥之前或之后插入 如果未创建密钥,则追加到数组末尾
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
)

【讨论】:

【参考方案9】:

不像Artefacto的回答那么具体,但根据他使用array_slice()的建议,我写了下一个函数:

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);

特点:

插入一个或多个值 插入键值对 在键之前/之后插入,或按偏移量插入

用法示例:

$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)); 

【讨论】:

【参考方案10】:

如果您只是想将一个项目插入到某个位置的数组中(基于@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;

【讨论】:

【参考方案11】:

我刚刚创建了一个 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 
)

【讨论】:

【参考方案12】:

这是在某个位置将项目插入数组的更好方法。

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;

【讨论】:

【参考方案13】:

这是我的版本:

/**
 * 
 * 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;

【讨论】:

【参考方案14】:

更简洁的方法(基于使用的流动性和更少的代码)。

/**
 * 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));

【讨论】:

【参考方案15】:

最简单的解决方案,如果你想在某个键之后插入(一个元素或数组):

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 
)

【讨论】:

【参考方案16】:

使用 array_splice 代替 array_slice 可以减少一次函数调用。

$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);

【讨论】:

【参考方案17】:

我需要一些可以在键之前、替换、之后进行插入的东西;如果找不到目标键,则在数组的开头或结尾添加。默认是在键之后插入。

新功能

/**
 * 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;

输入代码

$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);

输出

Array
(
    [0] => zero
    [1] => one
    [2] => two
    [sample_key] => sample_value
    [3] => three
)
Array
(
    [zero] => 0
    [one] => 1
    [two] => 2
    [sample_key] => sample_value
    [three] => 3
)

【讨论】:

【参考方案18】:

我这样做


    $slightly_damaged = array_merge(
        array_slice($slightly_damaged, 0, 4, true) + ["4" => "0.0"], 
        array_slice($slightly_damaged, 4, count($slightly_damaged) - 4, true)
    );

【讨论】:

格式代码请使用编辑菜单中提供的格式指南 【参考方案19】:

非常简单的 2 字符串回答您的问题:

$array_1 = array(
  '0' => 'zero',
  '1' => 'one',
  '2' => 'two',
  '3' => 'three',
);

首先,您使用 array_splice 向第三个元素插入任何内容,然后为该元素分配一个值:

array_splice($array_1, 3, 0 , true);
$array_1[3] = array('sample_key' => 'sample_value');

【讨论】:

【参考方案20】:

这是一个老问题,但我在 2014 年发表了评论,并经常回到这个问题。我想我会留下一个完整的答案。这不是最短的解决方案,但很容易理解。

将新值插入关联数组中,在编号位置,保留键并保留顺序。

$columns = array(
    'id' => 'ID',
    'name' => 'Name',
    'email' => 'Email',
    'count' => 'Number of posts'
);

$columns = array_merge(
    array_slice( $columns, 0, 3, true ),     // The first 3 items from the old array
    array( 'subscribed' => 'Subscribed' ),   // New value to add after the 3rd item
    array_slice( $columns, 3, null, true )   // Other items after the 3rd
);

print_r( $columns );

/*
Array ( 
    [id] => ID 
    [name] => Name 
    [email] => Email 
    [subscribed] => Subscribed 
    [count] => Number of posts 
)
*/

【讨论】:

【参考方案21】:

您可以在 foreach 循环期间插入元素,因为此循环适用于原始数组的副本,但您必须跟踪插入的行数(我在这段代码中称之为“膨胀”):

$bloat=0;
foreach ($Lines as $n=>$Line)
    
    if (MustInsertLineHere($Line))
        
        array_splice($Lines,$n+$bloat,0,"string to insert");
        ++$bloat;
        
    

显然,您可以概括这种“膨胀”的想法,以在 foreach 循环期间处理任意插入和删除。

【讨论】:

【参考方案22】:

这是PHP 7.1中的另一种解决方案


     /**
     * @param array $input    Input array to add items to
     * @param array $items    Items to insert (as an array)
     * @param int   $position Position to inject items from (starts from 0)
     *
     * @return array
     */
    function arrayInject( array $input, array $items, int $position ): array 
    
        if (0 >= $position) 
            return array_merge($items, $input);
        
        if ($position >= count($input)) 
            return array_merge($input, $items);
        

        return array_merge(
            array_slice($input, 0, $position, true),
            $items,
            array_slice($input, $position, null, true)
        );
    

【讨论】:

【参考方案23】:

试试这个 ===

$key_pos=0;
$a1=array("a"=>"red", "b"=>"green", "c"=>"blue", "d"=>"yellow");
$arrkey=array_keys($a1);
array_walk($arrkey,function($val,$key) use(&$key_pos) 
  if($val=='b')
    
        $key_pos=$key;
    
  );
$a2=array("e"=>"purple");
$newArray = array_slice($a1, 0, $key_pos, true) + $a2 +
        array_slice($a1, $key_pos, NULL, true);
print_r($newArray);

输出

Array (
      [a] => red
      [e] => purple
      [b] => green
      [c] => blue
      [d] => yellow )

【讨论】:

【参考方案24】:

这可以通过array.splice() 来完成。请注意 array_splice 或 array_merge 不保留关联数组的键。所以使用array_slice,并使用'+'操作符连接两个数组。

更多详情here



$array_1 = array(
    '0' => 'zero',
    '1' => 'one',
    '2' => 'two',
    '3' => 'three',
  );
  
  $array_2 = array(
    'zero'  => '0',
    'one'   => '1',
    'two'   => '2',
    'three' => '3',
  );
  $index = 2;
  $finalArray = array_slice($array_1, 0, $index, true) +
                $array2  +
                array_slice($array_2, $index, NULL, true);
print_r($finalArray);
/*
Array
(
    [0] => zero
    [1] => one
    [10] => grapes
    [z] => mangoes
    [two] => 2
    [three] => 3
)
*/




【讨论】:

以上是关于如何将元素插入到特定位置的数组中?的主要内容,如果未能解决你的问题,请参考以下文章

PHP 在特定位置插入/添加元素到数组

PHP 在特定位置插入/添加元素到数组

如何有效地将元素插入数组的任意位置?

在 Mongodb 数组中,有没有办法在特定元素位置之前/之后插入新元素

在 Mongodb 数组中,有没有办法在特定元素位置之前/之后插入新元素

使用打字稿将其他菜单元素插入到特定位置