2009-08-17 10 views
15

の配列を指定:その要素の一つにその内部ポインタでPHP配列の別の既知の(キーまたはポインタによって)要素の後に要素を効率的に挿入する方法は?

$a = array(
    'abc', 
    123, 
    'k1'=>'v1', 
    'k2'=>'v2', 
    78, 
    'tt', 
    'k3'=>'v3' 
); 

を、どのように私は、現在の要素の後の要素を挿入するのですか? そして、キーに既知の要素、たとえば 'k1'の後に要素を挿入するにはどうすればよいですか?

パフォーマンスケア〜

答えて

12

array_keysarray_valuesを使用して配列を分割し、それらをスプライスしてから再度結合してください。

$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

この解決策には1回限りのエラーがあります。 $ insertAfter ++を追加することで修正できます。 array_splice()が呼び出される前に – keithm

+0

@keithmが更新されました。 – nickf

1

要素を挿入するために内部配列ポインタを使用することはできません。

要素とサブアレイを挿入/削除/置換することができるarray_spliceがありますが、整数インデックス型配列を対象としています。

要素を挿入するために配列を再構築する必要があります(最初/最後の要素を挿入する場合を除いて)か、必要な順序でキーを保持するために別の整数インデックス配列を使用する必要があります。

0

この方法は、キーのない新しい値に対しては問題ありません。キーで値を挿入することはできません。数値インデックスは0から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

一般に、二重リンクリストがこのタスクには理想的です。

SplDoublyLinkedListと呼ばれるPHP 5.3以降の組み込みの実装があります。また、PHP 5.5以来、中間に値を追加/挿入することも可能なadd methodを持っています。

+0

実際には、[SplDoublyLinkedList](http://ee.php.net/manual/en/class.spldoublylinkedlist.php)を挿入することができます:SO上の他の人が簡単にそれを見つけることができますので、私は、それを文書化したいですこの[pull request](https://github.com/php/php-src)から[SplDoublyLinkedList :: addメソッド](http://php.net/manual/en/spldoublylinkedlist.add.php)を使用して、 /プル/ 288)。これがいつ追加されたのかわからないのは、ドキュメンテーションには、これが変更されたphpバージョンが記載されていないからです。 – Egregore

+0

実際にはバージョンを記述しています:(PHP 5> = 5.5.0) - 私はそれを反映するために答えを更新しました。 –

2

は、私は本当によく働く素晴らしい答えhereを発見しました。

/* 
* 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; 
} 
関連する問題