如何在PHP数组中的另一个已知(通过键或指针)元素之后高效地插入元素?
给定一个数组:如何在PHP数组中的另一个已知(通过键或指针)元素之后高效地插入元素?,php,performance,arrays,Php,Performance,Arrays,给定一个数组: $a = array( 'abc', 123, 'k1'=>'v1', 'k2'=>'v2', 78, 'tt', 'k3'=>'v3' ); 当其内部指针位于其元素之一时,如何在当前元素之后插入元素? 我如何在一个关键的已知元素后面插入一个元素,比如“k1” 性能维护~不能使用内部数组指针插入元素 有一个array\u splice可以插入/删除/替换元素和子数组,但它适用于整数索引数组 恐怕您必须重新
$a = array(
'abc',
123,
'k1'=>'v1',
'k2'=>'v2',
78,
'tt',
'k3'=>'v3'
);
当其内部指针位于其元素之一时,如何在当前元素之后插入元素?
我如何在一个关键的已知元素后面插入一个元素,比如“k1”
性能维护~不能使用内部数组指针插入元素 有一个
array\u splice
可以插入/删除/替换元素和子数组,但它适用于整数索引数组
恐怕您必须重新生成数组以插入元素(插入第一个/最后一个元素的情况除外),或者使用单独的整数索引数组按您想要的顺序保存键。这种方法适用于没有键的新值。不能使用键插入值,数字索引将“重置”为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'));
一般来说,双链表将是这项任务的理想选择
有一个内置的实现,因为PHP 5.3被调用,因为PHP 5.5也有,它允许在中间添加/插入值。
< P>可以通过使用<代码> ARRAYKEYKEX/COD>和<代码> ARRAYY值拆分数组,然后拼接它们,然后再组合它们。$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));
这里有一个很好的函数可以帮助您:我找到了一个非常好的答案。我想记录它,以便其他人可以轻松找到它:
/*
* 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;
}
此解决方案中存在一次性错误。可以通过添加$insertAfter++进行更正;在数组_splice()调用之前。实际上,允许在所需索引上插入,因为这样做。我不知道这是什么时候添加的,因为文档没有提到这是在哪个php版本中更改的。它实际上提到了版本:(PHP5>=5.5.0)-我更新了答案以反映这一点。有用的代码,我只是修改了它以增加值,以防键不存在。