Wstaw nowy element do tablicy na dowolnej pozycji w PHP

Odpowiedzi:

917

Może się to okazać nieco bardziej intuicyjne. Wymaga tylko jednego wywołania funkcji, aby 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

Jeśli zamiana jest tylko jednym elementem, nie jest konieczne umieszczanie wokół niej tablicy (), chyba że elementem jest sama tablica, obiekt lub wartość NULL.

jay.lee
źródło
32
Dziwne, że taka podstawowa funkcjonalność jest w rzeczywistości ukryta, ponieważ głównym celem tej funkcji opisanym w dokumentacji jest coś innego (zamieniaj elementy w tablice). Tak, zostało to wskazane w sekcji argumentów, ale jeśli skanujesz tylko opisy funkcji w celu znalezienia, czego użyć do wstawienia do tablic, nigdy byś go nie znalazł.
Mahn
23
Wystarczy powiedzieć, że nie zachowa to kluczy w $insertedtablicy.
Mauris
6
Również w podręczniku PHP, przykład # 1: php.net/manual/en/function.array-splice.php
marcovtwout
3
@JacerOmri jest całkowicie poprawne, oba oświadczenia są ważne. Możesz przekazać wartość dowolnego typu, ale może ona nie zachowywać się tak samo dla tablicy, obiektu lub wartości null. W przypadku skalarów rzutowanie typu (array)$scalarjest równoważne array($scalar), ale w przypadku tablicy, obiektu lub wartości null zostanie zignorowane (tablica), skonwertowane na tablicę (obiekt) lub stanie się pustą tablicą (null) - patrz php.net / manual / pl /…
Lukas
2
@SunilPachlangia, adelval i inne: z wielowymiarowymi tablicami musisz owinąć zamiennik w tablicę, jest to udokumentowane. Nadal przyniosłem wiadomość, żeby ludzie przestali popełniać błąd.
Félix Gagnon-Grenier
47

Funkcja, która może wstawiać zarówno liczby całkowite, jak i łańcuchowe:

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

Wykorzystanie liczby całkowitej:

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

Wykorzystanie ciągu:

$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',
  ),
)
Halil Özgür
źródło
1
array_splice()Traci klucze, natomiast array_merge()nie. Tak więc wyniki pierwszej funkcji mogą być bardzo zaskakujące ... Zwłaszcza, że ​​jeśli masz dwa elementy z tym samym kluczem, zachowana zostanie tylko wartość ostatniego z nich ...
Alexis Wilke,
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)
Bursztyn
źródło
10
Użycie +zamiast array_mergemoże zachować klucze
Mauris
1
Teraz mogę dodać więcej elementów przed INDEKSEM
Abbas,
5

W ten sposób możesz wstawiać tablice:

function array_insert(&$array, $value, $index)
{
    return $array = array_merge(array_splice($array, max(0, $index - 1)), array($value), $array);
}
Aleksandr Makov
źródło
2
Ta funkcja nie zapisuje kolejności w tablicy.
Daniel Petrovaliev
5

Nie ma natywnej funkcji PHP (o której wiem), która mogłaby zrobić dokładnie to, o co prosiłeś.

Napisałem 2 metody, które moim zdaniem są odpowiednie do celu:

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

Chociaż jest szybszy i prawdopodobnie bardziej wydajny pod względem pamięci, jest to naprawdę odpowiednie tylko wtedy, gdy nie jest konieczne utrzymywanie kluczy tablicy.

Jeśli musisz zachować klucze, bardziej odpowiednie byłyby następujące;

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;
}
Chłopiec o imieniu Su
źródło
1
To działa dobrze. Jednak w drugim przykładzie w funkcji insertBefore()powinieneś powrócić $tmpArrayzamiast $input.
Christoph Fischer
4

W oparciu o świetną odpowiedź @Halil, oto prosta funkcja, jak wstawić nowy element po określonym kluczu, zachowując klucze całkowite:

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)
    );
} 
d.raev
źródło
4

Jeśli chcesz zachować klucze początkowej tablicy, a także dodać tablicę zawierającą klucze, użyj poniższej funkcji:

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

Przykład połączenia:

$array = insertArrayAtPosition($array, array('key' => 'Value'), 3);
Mayra M.
źródło
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;
}
Henry Wong
źródło
3

Oto, co zadziałało w przypadku tablicy asocjacyjnej:

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

Źródło funkcji - ten post na blogu . Istnieje również przydatna funkcja wstawiania PRZED konkretnym kluczem.

Oksana Romaniv
źródło
2

Jest to również działające rozwiązanie:

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

kredyty przejdź do: http://binarykitten.com/php/52-php-insert-element-and-shift.html

Mike Doh
źródło
2

Rozwiązanie autorstwa jay.lee jest idealne. Jeśli chcesz dodać element (y) do tablicy wielowymiarowej, najpierw dodaj tablicę jednowymiarową, a następnie zastąp ją.

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

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

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

Dodanie elementu w tym samym formacie do tej tablicy spowoduje dodanie wszystkich nowych indeksów tablicy jako elementów zamiast po prostu elementu.

$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

Uwaga: Dodanie elementów bezpośrednio do tablicy wielowymiarowej za pomocą array_splice doda wszystkie jej indeksy jako elementy zamiast tylko tego elementu.

Abdul Mannan
źródło
2

Możesz tego użyć

foreach ($array as $key => $value) 
{
    if($key==1)
    {
        $new_array[]=$other_array;
    }   
    $new_array[]=$value;    
}
Diabeł
źródło
1

Zwykle z wartościami skalarnymi:

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

Aby wstawić pojedynczy element tablicy do tablicy, nie zapomnij owinąć tablicy w tablicę (ponieważ była to wartość skalarna!):

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

w przeciwnym razie wszystkie klucze tablicy zostaną dodane kawałek po kawałku.

znak
źródło
1

Wskazówka dotycząca dodawania elementu na początku tablicy :

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

następnie:

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

ale:

for ($i = -1; $i < count($a)-1; $i++)
     echo $a . ' ';
//returns i am as 1st element
forsberg
źródło
13
Wskazówka dotycząca dodawania elementu na początku:array_unshift($a,'i am the new first element');
1

jeśli nie jesteś pewien, NIE UŻYWAJ TEGO :

$arr1 = $arr1 + $arr2;

LUB

$arr1 += $arr2;

ponieważ + oryginalna tablica zostanie zastąpiona. ( patrz źródło )

T.Todua
źródło
1

Spróbuj tego:

$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;
}
Max
źródło
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;
}

Przykład połączenia:

$array = array_insert($array, 1, ['123', 'abc']);
Xayer
źródło
0

Aby wstawić elementy do tablicy za pomocą kluczy łańcuchowych, możesz zrobić coś takiego:

/* 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); 
} 
Bryan Plasters
źródło
2
dlaczego nie $src = array_merge($array_head, $ins, $array_tail);?
cartbeforehorse