วิธีแทรกองค์ประกอบลงในอาร์เรย์ในตำแหน่งที่ต้องการได้อย่างไร


190

ลองจินตนาการว่าเรามีสองอาร์เรย์:

$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')หลังจากองค์ประกอบที่สามของแต่ละอาร์เรย์ ฉันจะทำมันได้อย่างไร


คำตอบ:


208

array_slice()สามารถนำมาใช้เพื่อแยกส่วนของอาร์เรย์และผู้ประกอบการอาร์เรย์+สหภาพ( )สามารถรวมชิ้นส่วนอีกครั้ง

$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
    [two] => 2
    [my_key] => my_value
    [สาม] => 3
)

8
คุณควรใช้ array_splice () ตามที่ M42 แนะนำ มันแก้ปัญหาด้วยรหัสเพียงหนึ่งบรรทัด
nickh

27
+ไม่ควรใช้! ใช้array_mergeแทน! เพราะถ้าดัชนีเป็นจำนวนเต็ม (อาร์เรย์ปกติไม่ใช่แฮช) +จะไม่ทำงานตามที่คาดไว้ !!!
TMS

4
@Tomas ไม่ว่าจะทำงานตามที่คาดไว้หรือไม่ขึ้นอยู่กับความคาดหวังของคุณ array_mergeพฤติกรรมที่เกี่ยวกับแป้นตัวเลขไม่เหมาะสำหรับคำถามนี้
Artefacto

10
แทนที่จะใช้count($array)-3คุณสามารถระบุ null เป็นเอฟเฟกต์เดียวกันได้ นอกจากนี้การใช้array_mergeตามที่แนะนำ TMS ไม่จำเป็นต้องให้คุณใช้ดัชนีเฉพาะ ตัวอย่าง: เพิ่ม "ค่าใหม่" ให้กับอาร์เรย์ที่มีอยู่:$b = array_merge( array_slice( $a, 0, 1, true ), array( 'new-value' ), array_slice( $a, 1, null, true ) );
Radley Sustaire

1
ดูเหมือนจะมีความสับสนบางอย่างเกี่ยวกับ+ array_mergeหากคุณต้องการแทรกสิ่งต่างๆลงในอาร์เรย์ตัวเลขคุณไม่ควรใช้+เพราะมันอาจจะไม่ตรงกับที่คุณคาดหวัง แต่คุณไม่ควรใช้array_mergeอย่างใดอย่างหนึ่ง; สำหรับอาร์เรย์ตัวเลขปัญหาทั้งหมดนี้ได้รับการแก้ไขด้วยarray_spliceฟังก์ชัน สำหรับอาเรย์แบบเชื่อมโยงหรือแบบผสมคุณอาจไม่ต้องการให้คีย์ตัวเลขถูกทำดัชนีใหม่ดังนั้นการใช้+จึงเหมาะสมอย่างยิ่ง
meustrus

104

สำหรับอาร์เรย์แรกของคุณให้ใช้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);

และจัดเรียงปุ่มตามสิ่งที่คุณต้องการ


33
อาร์เรย์ที่สองมีคำสั่ง ... อาร์เรย์ทั้งหมดมีเนื่องจากเป็นรายการที่ลิงก์สองเท่า
Artefacto

5
-1 ดังที่กล่าวว่า "ไม่มีคำสั่งซื้อ" เป็นเท็จ และ array_splice จะทำลายการเชื่อมโยงคีย์ / ค่าในตัวอย่างแรก
แบรดโคช์

2
@Artefacto "อะเรย์" ใน PHP ในความเป็นจริง, สั่งซื้อตารางแฮช PHP อาร์เรย์ทำหน้าที่เหมือนอาร์เรย์ แต่มันไม่เคยเป็นอาร์เรย์จริงๆ พวกเขาไม่ได้เชื่อมโยงรายชื่อหรือรายการอาร์เรย์
Frederik Krautwald

1
5 ชั่วโมงต่อมาในที่สุดฉันก็อ่านคำตอบที่ฉันเข้าใจขอขอบคุณ! สิ่งหนึ่งที่น่าสังเกตว่าถ้ามีใครบางคนผลักอาร์เรย์ที่เชื่อมโยงพวกเขายังสามารถระบุ "อาร์เรย์" เป็นอาร์กิวเมนต์ที่ 4 ใน array_splice .. like ดังนั้น: array_splice ($ array_1, 3, 0, ARRAY ($ array_name_to_insert));
Robert Sinclair

1
@FrederikKrautwald ตั้งแต่ PHP 7 คำสั่งนั้นไม่เป็นความจริง PHP 7 ใช้สองอาร์เรย์เพื่อใช้ตารางแฮช + รายการสั่งซื้อ นี่คือบทความจากหนึ่งใน devs PHP หลัก (Nikic): nikic.github.io/2014/12/22/ …
CubicleSoft

19

รหัส:

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

อาจไม่ได้ดูสมบูรณ์แบบจริงๆ แต่ได้ผล


11
คุณกำลังพยายามทำการประกบกันโดยไม่ต้องพลิกโฉมพวงมาลัย
Paul Dragoonis

11
ไม่เขาไม่ได้คิดค้นล้อใหม่ array_splice () ไม่อนุญาตให้ใส่รหัสและค่า เฉพาะค่าที่มีตำแหน่งเฉพาะเป็นสำคัญ
Kirzilla

ใช่ แต่ดังที่กล่าวไว้ก่อนหน้านี้ array_splice ไม่สนับสนุนอาร์เรย์ที่เชื่อมโยงกัน ฉันมีความสุขมากกว่าที่จะเห็นวิธีการที่สง่างามมากขึ้น
clausvdb

ฟังก์ชั่นของคุณดีมาก แต่ก็ใช้งานไม่ได้กับตำแหน่งที่ใหญ่กว่าความยาวของอาร์เรย์ (ลองใช้งาน array_insert นี้ ($ array_2, array ("wow" => "wow"), 4)) แต่สามารถแก้ไขได้ง่าย คำตอบของคุณดีมากและคุณได้ตอบคำถามของฉันแล้ว!
Kirzilla

13

นี่คือฟังก์ชั่นพื้นฐานที่คุณสามารถใช้ได้ เพียงแค่เสียบ n play

นี่คือการแทรกโดยดัชนีไม่ใช่ตามค่า

คุณสามารถเลือกที่จะผ่านอาร์เรย์หรือใช้ที่คุณได้ประกาศไปแล้ว

แก้ไข: เวอร์ชันที่สั้นกว่า:

   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
)

12
$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

@roelleor แต่ต้องระวัง: "ถ้าอาร์เรย์อินพุตมีคีย์สตริงเหมือนกันดังนั้นค่าในภายหลังสำหรับคีย์นั้นจะเขียนทับคีย์ก่อนหน้านี้อย่างไรก็ตามหากอาร์เรย์มีคีย์ตัวเลขค่าในภายหลังจะไม่เขียนทับค่าเดิม แต่จะถูกต่อท้าย " - array_merge
ยาว

5

ฟังก์ชั่นนี้รองรับ:

  • ทั้งคีย์ตัวเลขและคีย์ assoc
  • แทรกก่อนหรือหลังคีย์ที่ก่อตั้ง
  • ต่อท้ายอาร์เรย์ถ้าไม่มีการสร้างคีย์

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
)

4

ฉันเพิ่งเขียนฟังก์ชันเพื่อทำสิ่งที่คล้ายกับสิ่งที่ดูเหมือนว่าคุณพยายามมันเป็นวิธีการที่คล้ายกับคำตอบของ 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, อาร์เรย์ ("wow" => "wow"), $ array_2); รับ $ array_2 จากข้อความคำถาม
Kirzilla

ฉันไม่คาดหวังว่าจะทำงานได้เนื่องจาก $ array_2 มีความสัมพันธ์และแนวคิดของตำแหน่งโดยทั่วไปจะไม่เกี่ยวข้องกับสถานการณ์ดังกล่าว
Peter O'Callaghan

4

หากคุณไม่รู้ว่าคุณต้องการแทรกที่ตำแหน่ง # 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;
    }

นี่คือซอ codepad ที่จะเห็นมันทำงาน: http://codepad.org/5WlKFKfz

หมายเหตุ: array_splice () จะมีประสิทธิภาพมากขึ้นกว่า array_merge (array_slice ()) แต่แล้วคีย์ของอาร์เรย์ที่คุณแทรกจะหายไป ถอนหายใจ


3

วิธีทำความสะอาด (ขึ้นอยู่กับความลื่นไหลของการใช้งานและรหัสน้อยลง)

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

2

วิธีที่ง่ายที่สุดหากคุณต้องการแทรก (องค์ประกอบหรืออาร์เรย์) หลังจากคีย์บางตัว:

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 
)

2

การใช้ 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);

2

ฉันทำอย่างนั้น


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

โค้ดรูปแบบโปรดใช้คำแนะนำการจัดรูปแบบที่มีให้ในเมนูแก้ไข <3
RaisingAgent

1

ฉันเพิ่งสร้างคลาส 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 
)

1

นี่เป็นวิธีที่ดีกว่าในการแทรกไอเท็มไปยังอาเรย์ในบางตำแหน่ง

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

1

ฉันต้องการบางสิ่งที่สามารถทำการแทรกมาก่อนแทนที่หลังคีย์ และเพิ่มที่จุดเริ่มต้นหรือจุดสิ้นสุดของอาร์เรย์หากไม่พบคีย์เป้าหมาย ค่าเริ่มต้นคือการแทรกหลังจากคีย์

ฟังก์ชั่นใหม่

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

1

คำตอบสตริงที่ง่ายมากสำหรับคำถามของคุณ:

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

1

นี่เป็นคำถามเก่า แต่ฉันโพสต์ความคิดเห็นในปี 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 
)
*/

0

ไม่เป็นรูปธรรมเหมือนคำตอบของ 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);
}

คุณสมบัติ:

  • การแทรกค่าหนึ่งหรือหลายmúltiple
  • การแทรกคู่ค่าคีย์
  • การใส่ก่อน / หลังกุญแจหรือโดยการชดเชย

ตัวอย่างการใช้งาน:

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

0

ในกรณีที่คุณต้องการแทรกรายการลงในอาร์เรย์ที่ตำแหน่งที่แน่นอน (ตาม @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;
}

0

นี่คือรุ่นของฉัน:

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

0

วิธีง่ายๆ.. การใช้ array_splice()

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

$addArray = array('sample_key' => 'sample_value');

array_splice($rs, 3, 0, $addArray);

ผลลัพธ์..

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

2
สิ่งนี้จะไม่เพิ่มความคิดเห็นและคำตอบอื่น ๆ ทั้งหมด
j08691

0

นี่เป็นวิธีแก้ปัญหาอื่นใน 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)
        );
    }

-1

คุณสามารถแทรกองค์ประกอบระหว่างการวนรอบ foreachเนื่องจากการวนซ้ำนี้ทำงานบนสำเนาของอาร์เรย์เดิม แต่คุณต้องติดตามจำนวนบรรทัดที่แทรก (ฉันเรียกว่า "bloat" ในรหัสนี้):

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

เห็นได้ชัดว่าคุณสามารถสรุปความคิด "ขยายตัว" นี้เพื่อจัดการกับการแทรกและการลบตามอำเภอใจระหว่างลูป foreach

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.