PHP'deki herhangi bir konuma diziye yeni öğe ekleme


Yanıtlar:


919

Bunu biraz daha sezgisel bulabilirsiniz. Yalnızca bir işlev çağrısı gerektirir 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

Değiştirme yalnızca bir öğeyse, öğenin bir dizinin kendisi, bir nesne veya NULL olmadığı sürece, dizi () koymak gerekmez.


32
Böyle bir temel işlevin aslında bir çeşit gizli olması tuhaftır, çünkü bu işlevin dokümantasyonda açıklandığı gibi ana amacı farklı bir şeydir (dizilerdeki şeyleri değiştirin). Evet, argümanlar bölümünde belirtilmiştir, ancak sadece dizilere eklemek için ne kullanacağınızı bulmak için işlev açıklamalarını tarıyorsanız, onu asla bulamazsınız.
Mahn

23
Sadece bunun $inserteddizideki anahtarları korumadığını söylemek .
mauris

6
Ayrıca PHP el kitabında, örnek # 1: php.net/manual/en/function.array-splice.php
marcovtwout

3
@JacerOmri tamamen doğru, her iki ifade de geçerlidir. Herhangi bir türde bir değer iletebilirsiniz, ancak bir dizi, nesne veya null için aynı davranmayabilir. Skalerlerde, tür dökümü (array)$scalareşdeğerdir array($scalar), ancak bir dizi, nesne veya null için yok sayılır (dizi), bir diziye (nesneye) dönüştürür veya boş bir dizi (null) olur - bkz. Php.net / manual / tr /…
Lukas

2
@SunilPachlangia, adelval ve diğerleri: çok boyutlu dizilerle değiştirmeyi bir diziye sarmanız gerekir, belgelenir. Notu hala buraya getirdim, böylece insanlar hatayı yapmayı bırakıyor.
Félix Gagnon-Grenier

47

Hem tamsayı hem de dize konumlarına eklenebilen bir işlev:

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

Tamsayı kullanımı:

$arr = ["one", "two", "three"];
array_insert(
    $arr,
    1,
    "one-half"
);
// ->
array (
  0 => 'one',
  1 => 'one-half',
  2 => 'two',
  3 => 'three',
)

Dize Kullanımı:

$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()Oysa anahtarlarını kaybeder array_merge()değildir. Bu nedenle, ilk işlevin sonuçları çok şaşırtıcı olabilir ... Özellikle aynı tuşa sahip iki öğeniz varsa, yalnızca
sonuncunun

33
$a = array(1, 2, 3, 4);
$b = array_merge(array_slice($a, 0, 2), array(5), array_slice($a, 2));
// $b = array(1, 2, 5, 3, 4)

10
Anahtarları korumak +yerine kullanmakarray_merge
mauris

1
Şimdi bir INDEX'ten daha fazla öğe ekleyebilirim
Abbas

5

Bu şekilde diziler ekleyebilirsiniz:

function array_insert(&$array, $value, $index)
{
    return $array = array_merge(array_splice($array, max(0, $index - 1)), array($value), $array);
}

2
Bu işlev, diziye sırayı kaydetmez.
Daniel Petrovaliev

5

Tam olarak ne istediğini yapabilirsiniz (farkında olduğum) hiçbir yerel PHP işlevi yoktur.

Amaca uygun olduğuna inandığım 2 yöntem yazdım:

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

Daha hızlı ve muhtemelen bellekte daha verimli olsa da, bu sadece dizinin anahtarlarını korumanın gerekli olmadığı yerlerde gerçekten uygundur.

Anahtarları korumanız gerekiyorsa, aşağıdakiler daha uygun olacaktır;

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
Bu iyi çalışıyor. Ancak, ikinci örnekte, işlevinizde insertBefore(), $tmpArrayyerine dönmelisiniz $input.
Christoph Fischer

4

@Halil harika cevabına dayanarak, tamsayı tuşlarını korurken belirli bir anahtardan sonra yeni elemanın nasıl ekleneceği basit bir fonksiyon:

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

İlk dizinin anahtarlarını tutmak ve ayrıca anahtarları olan bir dizi eklemek istiyorsanız, aşağıdaki işlevi kullanın:

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

Çağrı örneği:

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

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

3

İlişkilendirilebilir dizi için benim için bu işe yaradı:

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

İşlev kaynağı - bu blog yazısı . Ayrıca, belirli bir anahtarı ÖNCE yerleştirmek için kullanışlı bir işlev de vardır.


2

Bu aynı zamanda çalışan bir çözümdür:

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

krediler şu adrese gider: http://binarykitten.com/php/52-php-insert-element-and-shift.html


2

Jay.lee'nin çözümü mükemmel. Çok boyutlu bir diziye öğe (ler) eklemek istiyorsanız, önce tek boyutlu bir dizi ekleyin ve daha sonra bunu değiştirin.

$original = (
[0] => Array
    (
        [title] => Speed
        [width] => 14
    )

[1] => Array
    (
        [title] => Date
        [width] => 18
    )

[2] => Array
    (
        [title] => Pineapple
        [width] => 30
     )
)

Bu diziye aynı biçimde bir öğe eklenmesi, tüm yeni dizi dizinlerini yalnızca öğe yerine öğeler olarak ekler.

$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

Not: array_splice ile doğrudan çok boyutlu bir diziye öğe eklemek, tüm dizinlerini yalnızca bu öğe yerine öğe olarak ekler.


2

Bunu kullanabilirsiniz

foreach ($array as $key => $value) 
{
    if($key==1)
    {
        $new_array[]=$other_array;
    }   
    $new_array[]=$value;    
}

1

Normalde skaler değerlerle:

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

Dizinize tek bir dizi öğesi eklemek için diziyi bir diziye sarmayı unutmayın (skaler bir değer olduğu için!):

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

aksi takdirde dizinin tüm anahtarları parça parça eklenir.


1

Dizinin başına öğe eklemek için ipucu :

$a = array('first', 'second');
$a[-1] = 'i am the new first element';

sonra:

foreach($a as $aelem)
    echo $a . ' ';
//returns first, second, i am...

fakat:

for ($i = -1; $i < count($a)-1; $i++)
     echo $a . ' ';
//returns i am as 1st element

13
Başlangıçta bir öğe eklemek için ipucu:array_unshift($a,'i am the new first element');

1

emin değilseniz, BU KULLANMAYIN :

$arr1 = $arr1 + $arr2;

VEYA

$arr1 += $arr2;

çünkü + orijinal dizisinin üzerine yazılacaktır. ( kaynağa bakın )


1

Bunu dene:

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

Çağrı örneği:

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

0

Dize anahtarları olan bir diziye öğe eklemek için şöyle bir şey yapabilirsiniz:

/* 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
neden olmasın $src = array_merge($array_head, $ins, $array_tail);?
cartbeforehorse
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.