是的,这是一个棘手的问题;一个数组(没有副本),而不是任何奇数数组.让我解释一下,让我们从这里开始;
$a = array ( 'one' => 1, 'two' => 2, 'three' => 3, 'four' => 4, 'five' => 5, 'six' => 6 ) ;
假装这个阵列很长,超过一百长.我一步一步地循环它,但在某些时候(让我们弥补这发生在第二个项目)会发生一些事情.也许数据很时髦.然而,我们需要添加一些项目以供以后处理,然后继续循环,而不会丢失当前位置.基本上,我想做这样的事情;
echo current ( $a ) ; // 'two'
array_insert ( $a, 'four', 'new_item', 100 ) ;
echo current ( $a ) ; // 'two'
array_insert的定义是($array,$key_where_insert_happens,$new_key,$new_value);当然$new_key和$new_value应该包装在一个数组包装器中,但这就是现在的重点.以上是我在上面的代码运行后想要看到的内容;
print_r ( $a ) ; // array ( 'one' => 1, 'two' => 2, 'three' => 3, 'four' => 4, 'new_item' => 100, 'five' => 5, 'six' => 6 ) ;
echo current ( $a ) ; // 'two'
每当你使用array_splice,array_slice,array_push或大多数其他数组fiddling函数时,你基本上都会创建一个数组的副本,然后你可以将它复制回来,但这会破坏对原始数组和位置的引用,并且我上面的循环打破了.我可以使用直接引用(即$a [‘new_item’] =’what;)或将它放在最后,但这些都不会将项插入到给定位置.
任何接受者?如何直接在关联数组中进行真正的插入(在其他地方处理)?到目前为止我唯一的解决方案是;
>记录位置(当前())
>做splice / insert(array_slice)
>用new覆盖旧数组($old = $new)
>搜索新位置(首先重置()然后循环找到它[!!!!!!])
当然,有一种更好,更简单,更优雅的方式来做一些目前笨拙,沉重和拙劣蹒跚的事情?为什么没有可以快速帮助解决的array_set_position($key)函数,或者是直接在同一个数组(或两者)上工作的array_insert?
解决方法:
也许我没有正确理解你,但你有没有看过array_splice()
?
这answer可能也会引起你的兴趣.
会这样的吗?
function array_insert($input, $key, $value)
{
if (($key = array_search($key, array_keys($input))) !== false)
{
return array_splice($input, $key, 1, $value);
}
return $input;
}
这是我能想到的最好的:
$a = array
(
'one' => 1,
'two' => 2,
'three' => 3,
'four' => 4,
'five' => 5,
'six' => 6,
);
ph()->Dump(next($a)); // 2
array_insert($a, 'four', array('new_item' => 100));
ph()->Dump(current($a)); // 2
function array_insert(&$array, $key, $data)
{
$k = key($array);
if (array_key_exists($key, $array) === true)
{
$key = array_search($key, array_keys($array)) + 1;
$array = array_slice($array, null, $key, true) + $data + array_slice($array, $key, null, true);
while ($k != key($array))
{
next($array);
}
}
}
ph()->Dump($a);
/*
Array
(
[one] => 1
[two] => 2
[three] => 3
[four] => 4
[new_item] => 100
[five] => 5
[six] => 6
)
*/
我不认为可以设置数组内部指针without looping.