2009-08-17 5 views

Odpowiedz

12

Można to zrobić, dzieląc tablicę za pomocą array_keys i array_values, a następnie łącząc je, a następnie połączyć ponownie.

$insertKey = 'k1'; 

$keys = array_keys($arr); 
$vals = array_values($arr); 

$insertAfter = array_search($insertKey, $keys) + 1; 

$keys2 = array_splice($keys, $insertAfter); 
$vals2 = array_splice($vals, $insertAfter); 

$keys[] = "myNewKey"; 
$vals[] = "myNewValue"; 

$newArray = array_merge(array_combine($keys, $vals), array_combine($keys2, $vals2)); 
+0

Wystąpił jednorazowy błąd w tym rozwiązaniu. Można to poprawić, dodając $ insertAfter ++; przed wywołaniem array_splice(). – keithm

+0

@keithm updated. – nickf

1

Nie można użyć wewnętrznego wskaźnika tablicy do wstawiania elementów.

Istnieje array_splice, który może wstawiać/usuwać/zamieniać elementy i podmary, ale jest przeznaczony do tablic indeksowanych z całkowitą indeksem.

Obawiam się, że musisz przebudować tablicę, aby wstawić element (z wyjątkiem przypadków, w których chcesz wstawić pierwszy/ostatni element) lub użyć oddzielnej tablicy z indeksowaniem całkowitym do przechowywania kluczy w żądanej kolejności.

0

Ta metoda jest dobra dla nowych wartości bez kluczy. Nie można wstawić wartości za pomocą klawisza, a indeksy numeryczne zostaną "zresetowane" jako 0 do N-1.

$keys = array_keys($a); 
$index = array_flip($keys); 

$key = key($a); //current element 
//or 
$key = 'k1'; 

array_splice($a, $index[$key] + 1, 0, array('value')); 
1

Ogólnie podwójnie związana lista byłaby idealna do tego zadania.

Istnieje wbudowana implementacja tego od PHP 5.3, o nazwie SplDoublyLinkedList, a od PHP 5.5 ma również add method, co pozwala na dodawanie/wstawianie wartości w środku.

+0

Właściwie [SplDoublyLinkedList] (http://ee.php.net/manual/en/class.spldoublylinkedlist.php) pozwala na wstawienie o pożądanym indeksie za pomocą [SplDoublyLinkedList :: add method] (http://php.net/manual/en/spldoublylinkedlist.add.php) od tego [żądanie pobrania] (https://github.com/php/php-src/pull/288). Nie wiem, kiedy to zostało dodane, ponieważ dokumentacja nie wspomina, w której wersji php została zmieniona. – Egregore

+0

To faktycznie wspomina wersję: (PHP 5> = 5.5.0) - Zaktualizowałem odpowiedź, aby to odzwierciedlić. –

2

znalazłem wielką odpowiedź here że działa bardzo dobrze. Chcę udokumentować, więc inni na więc można go łatwo znaleźć:

/* 
* Inserts a new key/value before the key in the array. 
* 
* @param $key 
* The key to insert before. 
* @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_after() 
*/ 
function array_insert_before($key, array &$array, $new_key, $new_value) { 
    if (array_key_exists($key, $array)) { 
    $new = array(); 
    foreach ($array as $k => $value) { 
     if ($k === $key) { 
     $new[$new_key] = $new_value; 
     } 
     $new[$k] = $value; 
    } 
    return $new; 
    } 
    return FALSE; 
} 

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