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.


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

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)

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

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

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

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

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

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.


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


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.


2

Możesz tego użyć

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

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.


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

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 )


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

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

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

2
dlaczego nie $src = array_merge($array_head, $ins, $array_tail);?
cartbeforehorse
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.