47

配列要素を配列内の新しい位置に移動し、シーケンスにギャップがないようにインデックスを並べ替える単純な関数を探しています。連想配列で動作する必要はありません。誰でもこれについてアイデアを持っていますか?

$a = array(
      0 => 'a',
      1 => 'c',
      2 => 'd',
      3 => 'b',
      4 => 'e',
);
print_r(moveElement(3,1))
//should output 
    [ 0 => 'a',
      1 => 'b',
      2 => 'c',
      3 => 'd',
      4 => 'e' ]
4

9 に答える 9

115

コメントしたように、 2x array_splice、再番号付けする必要さえありません:

$array = [
    0 => 'a', 
    1 => 'c', 
    2 => 'd', 
    3 => 'b', 
    4 => 'e',
];

function moveElement(&$array, $a, $b) {
    $out = array_splice($array, $a, 1);
    array_splice($array, $b, 0, $out);
}

moveElement($array, 3, 1);

結果:

[
    0 => 'a',
    1 => 'b',
    2 => 'c',
    3 => 'd',
    4 => 'e',
];
于 2012-09-27T15:03:46.970 に答える
7

2 つの array_splice コマンドを使用した hakre のソリューションは、名前付き配列では機能しません。移動した要素のキーは失われます。

代わりに、配列を 2 回スプライスして、パーツをマージすることができます。

function moveElement(&$array, $a, $b) {
    $p1 = array_splice($array, $a, 1);
    $p2 = array_splice($array, 0, $b);
    $array = array_merge($p2,$p1,$array);
}

それはどのように機能しますか:

  • 最初:配列から要素を削除/スプライスします
  • 2番目:要素を挿入したい位置で配列を2つの部分にスプライスします
  • 3 つの部分を一緒にマージします。

例:

$fruits = array(
    'bananas'=>'12', 
    'apples'=>'23',
    'tomatoes'=>'21', 
    'nuts'=>'22',
    'foo'=>'a',
    'bar'=>'b'
);

moveElement($fruits, 1, 3);

// Result
['bananas'=>'12', 'tomatoes'=>'21', 'nuts'=>'22', 'apples'=>'23', 'foo'=>'a', 'bar'=>'b']
于 2015-03-03T12:37:45.330 に答える
0

私が間違っているかもしれませんが、配列のコピーを作成して値を置き換えるだけの方が簡単ではないでしょうか?

function swap($input, $a, $b){
  $output = $input;
  $output[$a] = $input[$b];
  $output[$b] = $input[$a];
  return $output;
}

$array = ['a', 'c', 'b'];
$array = swap($array, 1, 2);
于 2016-03-17T23:52:41.893 に答える
0

同様の問題について説明しているこのスレッドを見てください。次のソリューションが提供されます。

/**
 * Move array element by index.  Only works with zero-based,
 * contiguously-indexed arrays
 *
 * @param array $array
 * @param integer $from Use NULL when you want to move the last element
 * @param integer $to   New index for moved element. Use NULL to push
 * 
 * @throws Exception
 * 
 * @return array Newly re-ordered array
 */
function moveValueByIndex( array $array, $from=null, $to=null )
{
  if ( null === $from )
  {
    $from = count( $array ) - 1;
  }

  if ( !isset( $array[$from] ) )
  {
    throw new Exception( "Offset $from does not exist" );
  }

  if ( array_keys( $array ) != range( 0, count( $array ) - 1 ) )
  {
    throw new Exception( "Invalid array keys" );
  }

  $value = $array[$from];
  unset( $array[$from] );

  if ( null === $to )
  {
    array_push( $array, $value );
  } else {
    $tail = array_splice( $array, $to );
    array_push( $array, $value );
    $array = array_merge( $array, $tail );
  }

  return $array;
}
于 2012-09-27T15:08:50.967 に答える
0

以前の回答に基づいています。連想配列のキー インデックスを保存する必要がある場合は、任意の数値または文字列にすることができます。

function custom_splice(&$ar, $a, $b){
    $out = array_splice($ar, $a, 1);
    array_splice($ar, $b, 0, $out);
}

function moveElement(&$array, $a, $b) {
    $keys = array_keys($array);

    custom_splice($array, $a, $b);
    custom_splice($keys, $a, $b); 

    $array = array_combine($keys,$array);
}
$s = '{ 
"21": "b", 
"2": "2", 
"3": "3", 
"4": "4", 
"6": "5", 
"7": "6" 
}';
$e = json_decode($s,true);

moveElement($e, 2, 0); 

print_r($e);

Array
(
    [3] => 3
    [21] => b
    [2] => 2
    [4] => 4
    [6] => 5
    [7] => 6
)

デモ

A previous answer数値インデックスを破棄します - から開始し0ます。

于 2020-03-24T14:57:01.353 に答える
-1

補助変数を作成する必要があります。

moveElement($a, $i,$j)
  {
  $k=$a[$i];
  $a[$i]=$a[$j];
  $a[$j]=$k;
  return $a;
  }
于 2012-09-27T14:59:29.357 に答える