0

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

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

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

交换数组($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     

交换数组($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 

交换数组($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 
4

3 回答 3

2

从它的位置(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真的很强大。

于 2012-10-06T17:32:36.023 回答
0

起初这看起来很复杂,但它只是基本的变量交换和保留密钥。你需要的是在你的函数中引用 &

$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;
}
于 2012-10-06T16:58:50.290 回答
0

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

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 的值将出现在数组的末尾...

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

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

echo '<xmp>';
print_r($array);
echo '</xmp>';
于 2012-10-06T17:54:30.093 回答