ฉันจะแทรกรายการใหม่ลงในอาร์เรย์ในตำแหน่งใด ๆ ได้อย่างไรตัวอย่างเช่นในช่วงกลางของอาร์เรย์
ฉันจะแทรกรายการใหม่ลงในอาร์เรย์ในตำแหน่งใด ๆ ได้อย่างไรตัวอย่างเช่นในช่วงกลางของอาร์เรย์
คำตอบ:
คุณอาจพบว่าใช้งานง่ายกว่านี้เล็กน้อย ต้องการเพียงหนึ่งฟังก์ชันที่เรียกไปยัง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
$inserted
อาร์เรย์
(array)$scalar
นั้นเทียบเท่ากับarray($scalar)
แต่สำหรับอาเรย์วัตถุหรือโมฆะมันจะถูกละเว้น (อาเรย์) แปลงเป็นอาเรย์ (วัตถุ) หรือกลายเป็นอาเรย์ที่ว่างเปล่า (null) - ดูphp.net / manual / en / …
ฟังก์ชั่นที่สามารถแทรกทั้งตำแหน่งจำนวนเต็มและตำแหน่งสตริง:
/**
* @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',
),
)
array_splice()
สูญเสียกุญแจในขณะที่array_merge()
ไม่ได้ ดังนั้นผลลัพธ์ของฟังก์ชันแรกจึงน่าแปลกใจมาก ... โดยเฉพาะอย่างยิ่งเพราะถ้าคุณมีสององค์ประกอบที่มีคีย์เดียวกันเฉพาะค่าขององค์ประกอบสุดท้ายจะถูกเก็บไว้ ...
วิธีนี้คุณสามารถแทรกอาร์เรย์:
function array_insert(&$array, $value, $index)
{
return $array = array_merge(array_splice($array, max(0, $index - 1)), array($value), $array);
}
ไม่มีฟังก์ชั่น 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;
}
insertBefore()
คุณควรกลับมาแทน$tmpArray
$input
ตาม @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)
);
}
หากคุณต้องการเก็บคีย์ของอาเรย์เริ่มต้นและเพิ่มอาเรย์ที่มีคีย์ให้ใช้ฟังก์ชั่นด้านล่าง:
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);
function insert(&$arr, $value, $index){
$lengh = count($arr);
if($index<0||$index>$lengh)
return;
for($i=$lengh; $i>$index; $i--){
$arr[$i] = $arr[$i-1];
}
$arr[$index] = $value;
}
นี่คือสิ่งที่ทำงานสำหรับฉันสำหรับอาร์เรย์ที่เชื่อมโยง:
/*
* 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;
}
แหล่งที่มาของฟังก์ชั่น - โพสต์บล็อกนี้ นอกจากนี้ยังมีฟังก์ชั่นที่ใช้งานง่ายเพื่อแทรกคีย์เฉพาะก่อน
นี่เป็นวิธีการแก้ปัญหาการทำงาน:
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
โซลูชันโดย 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จะเพิ่มดัชนีทั้งหมดเป็นรายการแทนที่จะเป็นเพียงแค่รายการนั้น
คุณสามารถใช้สิ่งนี้
foreach ($array as $key => $value)
{
if($key==1)
{
$new_array[]=$other_array;
}
$new_array[]=$value;
}
โดยปกติด้วยค่าสเกลาร์:
$elements = array('foo', ...);
array_splice($array, $position, $length, $elements);
ในการแทรกองค์ประกอบอาเรย์เดียวในอาเรย์ของคุณอย่าลืมล้อมอาเรย์ในอาร์เรย์ (เนื่องจากเป็นค่าสเกลาร์!):
$element = array('key1'=>'value1');
$elements = array($element);
array_splice($array, $position, $length, $elements);
มิฉะนั้นคีย์ทั้งหมดของอาร์เรย์จะถูกเพิ่มทีละชิ้น
คำแนะนำสำหรับการเพิ่มองค์ประกอบที่จุดเริ่มต้นของอาร์เรย์ :
$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
ถ้าไม่แน่ใจก็อย่าใช้สิ่งเหล่านี้ :
$arr1 = $arr1 + $arr2;
หรือ
$arr1 += $arr2;
เพราะด้วย+อาร์เรย์ดั้งเดิมจะถูกเขียนทับ ( ดูแหล่งที่มา )
ลองอันนี้:
$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;
}
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']);
สำหรับการแทรกองค์ประกอบลงในอาร์เรย์ด้วยคีย์สตริงคุณสามารถทำสิ่งนี้:
/* 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);
}
$src = array_merge($array_head, $ins, $array_tail);
?