【发布时间】:2012-10-06 16:52:08
【问题描述】:
交换多维数组中的元素及其上方的兄弟元素。
我希望数组中具有选定索引的元素与他上方的元素交换它的位置。
- 元素从它的位置(N)到位置(N-1)
- 我希望位置(N-1)处的元素进入位置(N),
- 生成的索引应该正确地反映它们在数组中的新顺序。
array_values($tmparr);确实对索引进行了正确排序 - 要交换的目标元素可以转到 Position(0),但永远不会从 Position(0) 开始
- 如果位于 Position(0) 则要向下交换的元素应该位于 position(1) 而不是位于数组的末尾。
虽然这个函数在语义上解释了我想要做什么,但它根本不起作用。
function swaparray($tmparr,$posa,$posb){
$vala = $tmparr[$posa];
$valb = $tmparr[$posb];
$tmparr[$posa] = $valb;
$tmparr[$posb] = $vala;
return $tmparr; }
第二个函数将预期的目标向上移动,但是如果他在位置 0,上面的元素被向上推并到列表的末尾,它不会在目标下方,所以它不能按预期工作
function swaparray($tmparr,$posa,$posb){
$vala = $tmparr[$posa];
$valb = $tmparr[$posb];
unset($tmparr[$posa]);
unset($tmparr[$posb]);
$tmparr[$posa] = $valb;
$tmparr[$posb] = $vala;
$tmparr = array_values($tmparr);
return $tmparr;
}
进一步了解我的问题是接缝 Array_splice() 可以解决问题。您对此有何意见?
编辑答案:(PHP >= 4.3.8)
Array_splice() 的工作解决方案
function swaparray($array, $n) {
// taking out at $n
$out = array_splice($array, $n, 1);
// adding in at $n - 1
array_splice($array, $n - 1, 0, $out);
return $array;
}
这里是原始的多维数组
Array ( [0] => Array ( [key1] => 1 [key2] => 1 [key3] => 1 [key4] => 1 )
[1] => Array ( [key1] => 2 [key2] => 2 [key3] => 2 [key4] => 2 )
[2] => Array ( [key1] => 3 [key2] => 3 [key3] => 3 [key4] => 3 )
[3] => Array ( [key1] => 4 [key2] => 4 [key3] => 4 [key4] => 4 ) )
这是我想要它做的一个摘录/示例。
[0] key1=1 key2=1 key3=1 key4=1
[1] key1=2 key2=2 key3=2 key4=2
[2] key1=3 key2=3 key3=3 key4=3 <-
[3] key1=4 key2=4 key3=4 key4=4
swaparray($tmparr,2);
[0] key1=1 key2=1 key3=1 key4=1
[1] key1=3 key2=3 key3=3 key4=3 <-
[2] key1=2 key2=2 key3=2 key4=2
[3] key1=4 key2=4 key3=4 key4=4
swaparray($tmparr,1);
[0] key1=3 key2=3 key3=3 key4=3 <-
[1] key1=1 key2=1 key3=1 key4=1
[2] key1=2 key2=2 key3=2 key4=2
[3] key1=4 key2=4 key3=4 key4=4
swaparray($tmparr,1);
[0] key1=1 key2=1 key3=1 key4=1 <-
[1] key1=3 key2=3 key3=3 key4=3
[2] key1=2 key2=2 key3=2 key4=2
[3] key1=4 key2=4 key3=4 key4=4
【问题讨论】:
-
@hakre - 到目前为止,array_splice 的实现很棘手,至于原来的,我可以改写它,但我真的不能让它更简单。
-
@hakre 您对 moveElement 重命名为 swaparray 的建议不适用于多维/关联数组。
-
PHP 4.3.8 太本地化了! Quoting GuruJR: “它需要在 php4 上工作,我检查一下迭代编辑:PHP/4.3.8”.
-
@hakre 谢谢,这是我一直在寻找的东西,我是否艰难 Array_splice() 是要走的路,感谢您为我指明了正确的方向。我只需要稍微了解一下你的实现。
标签: php multidimensional-array associative-array array-splice