【问题标题】:Array_splice to swap an element with previous in a multidimensional associative array [closed]Array_splice 与多维关联数组中的前一个元素交换元素[关闭]
【发布时间】:2012-10-06 16:52:08
【问题描述】:

交换多维数组中的元素及其上方的兄弟元素。

我希望数组中具有选定索引的元素与他上方的元素交换它的位置。

  1. 元素从它的位置(N)到位置(N-1)
  2. 我希望位置(N-1)处的元素进入位置(N),
  3. 生成的索引应该正确地反映它们在数组中的新顺序。 array_values($tmparr); 确实对索引进行了正确排序
  4. 要交换的目标元素可以转到 Position(0),但永远不会从 Position(0) 开始
  5. 如果位于 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


【解决方案1】:

从它的位置(N)到位置(N-1)的元素 我希望位置(N-1)处的元素进入位置(N),

你所说的只是你想交换两者,其中 N 在零索引数组中永远不是 0。

将元素 N 移动到 N-1:

/** 
  * [0] is top
  */
function moveUp(&$array, $n) {
    if ($n < 1)             throw new InvalidArgumentException();
    if (!isset($array[$n])) throw new InvalidArgumentException();
    // taking out at $n
    $out = array_splice($array, $n, 1);
    // adding in at $n - 1
    array_splice($array, $n - 1, 0, $out);
}

用法:

$n = 2;
moveUp($array, $n);
var_dump($array);

因为N-1的元素会在前面添加一个元素,所以它会自动移动到N。工作完成。 array_splice 真的很强大。

【讨论】:

  • +1 不错的代码...但是您认为这比存储和重新分配数组值更简单吗? :)
  • 大师,你用的是哪个PHP版本?
  • 它需要在 php4 上工作,检查迭代编辑:PHP/4.3.8
  • 好吧,如果您支付额外费用,我会支持您,这不属于本网站。 PHP 4 已停产,此处不提供免费支持。
  • @hakre 将它串起来用于老式服务器,但它确实有效。生病添加修复到我的问题。
【解决方案2】:

起初看起来很复杂,但它只是基本的变量交换和保留密钥。你需要的是Reference with & in your function

$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 ) );

swaparray($array,2,1);
var_dump($array);

输出

array
  0 => 
    array
      'key1' => int 1
      'key2' => int 1
      'key3' => int 1
      'key4' => int 1
  1 => 
    array
      'key1' => int 3
      'key2' => int 3
      'key3' => int 3
      'key4' => int 3
  2 => 
    array
      'key1' => int 2
      'key2' => int 2
      'key3' => int 2
      'key4' => int 2
  3 => 
    array
      'key1' => int 4
      'key2' => int 4
      'key3' => int 4
      'key4' => int 4

如果你运行 3 次 swaparray

swaparray($array,2,1);
swaparray($array,1,0);
swaparray($array,1,0);

var_dump($array);

你会得到

array
  0 => 
    array
      'key1' => int 1
      'key2' => int 1
      'key3' => int 1
      'key4' => int 1
  1 => 
    array
      'key1' => int 3
      'key2' => int 3
      'key3' => int 3
      'key4' => int 3
  2 => 
    array
      'key1' => int 2
      'key2' => int 2
      'key3' => int 2
      'key4' => int 2
  3 => 
    array
      'key1' => int 4
      'key2' => int 4
      'key3' => int 4
      'key4' => int 4

使用的功能

function swaparray(&$array, $originKey, $destinationKey) {
    $origin = isset($array[$originKey]) ? $array[$originKey] : false;
    $destination = isset($array[$destinationKey]) ? $array[$destinationKey] : false;

    if ($origin && $destination) {
        $array[$originKey] = $destination;
        $array[$destinationKey] = $origin;
        return true;
    }
    return false;
}

【讨论】:

  • 刚试过,对我不起作用,它给我的结果与我的第一个函数相同,没有任何动作。
  • @GuruJR 看现场测试codepad.org/uqgYQ1J5
  • @GuruJR 在同一阵列上运行 3 次不同交换的示例 codepad.org/JaKAsG5F
  • @Baba- 我知道我试过了,它在那个服务器下不起作用,即使变量是通过引用传递的。你刚刚改写了我说的函数不起作用,数组只是没有移动。它保持不变,请尝试您的编辑,但到目前为止,我得到的结果与使用麻烦的功能时得到的结果相同。
  • @GuruJR 服务器规范是什么,还要在脚本顶部添加error_reporting(E_ALL)ini_set("display_error","On")
【解决方案3】:

一个快速简单的版本,几乎可以满足您的需求 - 与此页面上的所有其他选项一样 - 我特别惊讶您自己的第一个功能也不能满足您的需求?据我所知,它应该可以完美运行......唯一的区别是它不会通过引用传递。

function moveUp2(&$array, $n){
  if ( $n && array_key_exists($n, $array) ) {
    list( $array[$n-1], $array[$n] ) = array( $array[$n], $array[$n-1] );
  }
}

/// example usage
moveUp2( $array, 1 );

echo '<xmp>';
print_r($array);
echo '</xmp>';

显然,上面的函数假设您使用的是数字键,并且数组中的所有键都是按顺序排列的 - 例如,如果您有像 0,1,3,4 这样的键 - 那么移位 3 将意味着值放置在 2 会出现在数组的末尾...

如果您发现数组引用导致问题,只需删除参数列表中的&amp; 并确保函数返回$array。这意味着示例用法显然会改变:

/// example usage
$array = moveUp2( $array, 1 );

echo '<xmp>';
print_r($array);
echo '</xmp>';

【讨论】:

  • 我知道最初的函数应该可以工作,但是某些版本的 php 在数组操作上丢球了。如果您进入基本 array[key1] = array[key2] 分配不起作用的地方。试试这个不错的技巧。
  • 嘿,我不知道你经历过什么版本的 php :S 但我从 v2 开始就一直在使用 php,并且数组做意想不到的事情从来没有遇到过任何问题......一件事您可能不得不提防 array['1']array[1] 之间的区别,但除此之外,我不知道是什么导致了这样的问题。祝你好运。
猜你喜欢
  • 1970-01-01
  • 2019-08-02
  • 1970-01-01
  • 2020-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-09
  • 1970-01-01
相关资源
最近更新 更多