【发布时间】:2011-08-21 08:46:09
【问题描述】:
是的,这是一个有点棘手的问题; 一个 数组(没有副本),而不是任何奇数数组。让我解释一下,让我们从这里开始;
$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 或大多数其他数组摆弄函数时,您基本上都会创建数组的副本,然后您可以将其复制回来,但这会破坏对原始数组的引用和位置好吧,我上面的循环中断了。我可以使用直接引用(即$a['new_item'] = 'whatever;)或将其放在末尾,但这些都不会将项目插入给定位置。
有接受者吗?如何直接将真正的插入到关联数组中(正在其他地方处理)?到目前为止,我唯一的解决方案是;
- 记录位置 (
current()) - 进行拼接/插入 (array_slice)
- 用新的 ($old = $new) 覆盖旧数组
- 搜索新位置(首先 reset() 然后循环查找 [!!!!!!])
肯定有更好、更简单、更优雅的方式来处理目前笨拙、笨重和笨拙的事情吗?为什么没有一个 array_set_position ( $key ) 函数可以快速解决这个问题,或者一个 array_insert 直接作用于同一个数组(或两者)?
【问题讨论】:
-
你能保证你添加的项目在当前位置之后吗?如果没有,那么它无论如何都不会得到处理。
-
听起来你最好使用array_map
-
埃德,是的,一个恰当的观点。大多数情况下,这是我正在迭代的堆栈,堆栈早期的事件可能会添加稍后运行的事件。
-
samshull,不确定您对此有何看法? Array_map 迭代并在这些项目上运行函数,但不会改变数组中项目的数量,是吗?
-
好吧,我已经浏览了google.com/codesearch/p?hl=en#EKZaOgYQHwo/unstable/sources/…,除了 Z_ARRVAL_PP 实现的一些改进空间(在源文件中的此注释附近;“/* * 这是魔法发生了。*/" :) 太棒了。