如何在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)-我更新了答案以反映这一点。有用的代码,我只是修改了它以增加值,以防键不存在。