0

多次元配列の要素をスワップアップし、その上に兄弟があります。

配列内で選択されたインデックスを持つ要素が、その位置を彼の上の要素と交換するようにします。

  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; }

2番目の関数は目的のターゲットを上にシフトしますが、上記の要素は上に押し上げられ、位置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;
}

私の問題についてさらに読むと、seams 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 
4

3 に答える 3

2

その位置(N)から位置(N-1)に移動する要素位置(N-1)にある要素を位置(N)に移動させたいのですが、

あなたが言うのは、2つを交換したいということだけです。ここで、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の要素は、前に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 に答える