แทรกรายการใหม่ในอาร์เรย์ในตำแหน่งใด ๆ ใน PHP


497

ฉันจะแทรกรายการใหม่ลงในอาร์เรย์ในตำแหน่งใด ๆ ได้อย่างไรตัวอย่างเช่นในช่วงกลางของอาร์เรย์


คำตอบ:


919

คุณอาจพบว่าใช้งานง่ายกว่านี้เล็กน้อย ต้องการเพียงหนึ่งฟังก์ชันที่เรียกไปยังarray_splice:

$original = array( 'a', 'b', 'c', 'd', 'e' );
$inserted = array( 'x' ); // not necessarily an array, see manual quote

array_splice( $original, 3, 0, $inserted ); // splice in at position 3
// $original is now a b c x d e

หากการแทนที่เป็นเพียงองค์ประกอบเดียวก็ไม่จำเป็นที่จะต้องใส่ array () รอบ ๆ องค์ประกอบนั้นยกเว้นว่าองค์ประกอบนั้นเป็นอาร์เรย์เองวัตถุหรือ NULL


32
เป็นเรื่องแปลกที่ฟังก์ชั่นพื้นฐานดังกล่าวซ่อนอยู่จริงๆในจุดประสงค์หลักของฟังก์ชั่นนี้ตามที่อธิบายไว้ในเอกสารประกอบนั้นเป็นสิ่งที่แตกต่างกัน (แทนที่สิ่งต่าง ๆ ในอาร์เรย์) ใช่มันจะชี้ให้เห็นในส่วนอาร์กิวเมนต์ แต่ถ้าคุณเป็นเพียงการสแกนคำอธิบายฟังก์ชั่นเพื่อหาสิ่งที่จะใช้ในการแทรกในอาร์เรย์คุณจะไม่เคยพบมัน
Mahn

23
เพียงแค่บอกว่าสิ่งนี้จะไม่เก็บคีย์ไว้ใน$insertedอาร์เรย์
mauris

6
นอกจากนี้ในคู่มือ PHP เช่น # 1: php.net/manual/en/function.array-splice.php
marcovtwout

3
@JacerOmri มันเป็นสิ่งที่ถูกต้องโดยสมบูรณ์, ข้อความทั้งสองนั้นใช้ได้ คุณสามารถส่งผ่านค่าชนิดใดก็ได้ แต่มันอาจไม่ทำงานเหมือนกันสำหรับอาร์เรย์วัตถุหรือโมฆะ สำหรับสเกลาร์การหล่อแบบ(array)$scalarนั้นเทียบเท่ากับarray($scalar)แต่สำหรับอาเรย์วัตถุหรือโมฆะมันจะถูกละเว้น (อาเรย์) แปลงเป็นอาเรย์ (วัตถุ) หรือกลายเป็นอาเรย์ที่ว่างเปล่า (null) - ดูphp.net / manual / en / …
Lukas

2
@SunilPachlangia, adelval และอื่น ๆ : ด้วยอาเรย์หลายมิติที่คุณต้องใช้ในการแทนที่อาเรย์ ฉันยังนำบันทึกย่อมาไว้ที่นี่เพื่อให้ผู้คนหยุดทำผิด
Félix Gagnon-Grenier

47

ฟังก์ชั่นที่สามารถแทรกทั้งตำแหน่งจำนวนเต็มและตำแหน่งสตริง:

/**
 * @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',
)

การใช้งานสตริง:

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

1
array_splice()สูญเสียกุญแจในขณะที่array_merge()ไม่ได้ ดังนั้นผลลัพธ์ของฟังก์ชันแรกจึงน่าแปลกใจมาก ... โดยเฉพาะอย่างยิ่งเพราะถ้าคุณมีสององค์ประกอบที่มีคีย์เดียวกันเฉพาะค่าขององค์ประกอบสุดท้ายจะถูกเก็บไว้ ...
Alexis Wilke



5

ไม่มีฟังก์ชั่น PHP พื้นเมือง (ที่ฉันรู้) ที่สามารถทำสิ่งที่คุณขอได้

ฉันได้เขียน 2 วิธีที่ฉันเชื่อว่าเหมาะสมสำหรับวัตถุประสงค์:

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

ในขณะที่เร็วขึ้นและอาจมีประสิทธิภาพมากกว่าหน่วยความจำนี่เป็นเพียงเหมาะจริง ๆ ที่ไม่จำเป็นต้องบำรุงรักษาคีย์ของอาเรย์

หากคุณจำเป็นต้องดูแลรักษากุญแจดังต่อไปนี้จะเหมาะสมกว่า

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

1
ใช้งานได้ดี อย่างไรก็ตามในตัวอย่างที่สองในการทำงานของคุณinsertBefore()คุณควรกลับมาแทน$tmpArray $input
Christoph Fischer

4

ตาม @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)
    );
} 

4

หากคุณต้องการเก็บคีย์ของอาเรย์เริ่มต้นและเพิ่มอาเรย์ที่มีคีย์ให้ใช้ฟังก์ชั่นด้านล่าง:

function insertArrayAtPosition( $array, $insert, $position ) {
    /*
    $array : The initial array i want to modify
    $insert : the new array i want to add, eg array('key' => 'value') or array('value')
    $position : the position where the new array will be inserted into. Please mind that arrays start at 0
    */
    return array_slice($array, 0, $position, TRUE) + $insert + array_slice($array, $position, NULL, TRUE);
}

ตัวอย่างการโทร:

$array = insertArrayAtPosition($array, array('key' => 'Value'), 3);


3

นี่คือสิ่งที่ทำงานสำหรับฉันสำหรับอาร์เรย์ที่เชื่อมโยง:

/*
 * Inserts a new key/value after the key in the array.
 *
 * @param $key
 *   The key to insert after.
 * @param $array
 *   An array to insert in to.
 * @param $new_key
 *   The key to insert.
 * @param $new_value
 *   An value to insert.
 *
 * @return
 *   The new array if the key exists, FALSE otherwise.
 *
 * @see array_insert_before()
 */
function array_insert_after($key, array &$array, $new_key, $new_value) {
  if (array_key_exists($key, $array)) {
    $new = array();
    foreach ($array as $k => $value) {
      $new[$k] = $value;
      if ($k === $key) {
        $new[$new_key] = $new_value;
      }
    }
    return $new;
  }
  return FALSE;
}

แหล่งที่มาของฟังก์ชั่น - โพสต์บล็อกนี้ นอกจากนี้ยังมีฟังก์ชั่นที่ใช้งานง่ายเพื่อแทรกคีย์เฉพาะก่อน


2

นี่เป็นวิธีการแก้ปัญหาการทำงาน:

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


2

โซลูชันโดย jay.lee นั้นสมบูรณ์แบบ ในกรณีที่คุณต้องการเพิ่มรายการลงในอาร์เรย์หลายมิติให้เพิ่มอาร์เรย์มิติเดียวก่อนแล้วจึงแทนที่รายการในภายหลัง

$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จะเพิ่มดัชนีทั้งหมดเป็นรายการแทนที่จะเป็นเพียงแค่รายการนั้น



1

โดยปกติด้วยค่าสเกลาร์:

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

ในการแทรกองค์ประกอบอาเรย์เดียวในอาเรย์ของคุณอย่าลืมล้อมอาเรย์ในอาร์เรย์ (เนื่องจากเป็นค่าสเกลาร์!):

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

มิฉะนั้นคีย์ทั้งหมดของอาร์เรย์จะถูกเพิ่มทีละชิ้น


1

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

$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

13
คำแนะนำสำหรับการเพิ่มองค์ประกอบที่จุดเริ่มต้น:array_unshift($a,'i am the new first element');


1

ลองอันนี้:

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

1
function array_insert($array, $position, $insert) {
    if ($position > 0) {
        if ($position == 1) {
            array_unshift($array, array());
        } else {
            $position = $position - 1;
            array_splice($array, $position, 0, array(
                ''
            ));
        }
        $array[$position] = $insert;
    }

    return $array;
}

ตัวอย่างการโทร:

$array = array_insert($array, 1, ['123', 'abc']);

0

สำหรับการแทรกองค์ประกอบลงในอาร์เรย์ด้วยคีย์สตริงคุณสามารถทำสิ่งนี้:

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

2
ทำไมไม่$src = array_merge($array_head, $ins, $array_tail);?
cartbeforehorse
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.