-1

配列をシャッフルするのに問題があります。うまくいけば、誰かが私を導くことができますか?

私はこの配列を持っています:(この配列はランダムな関連関数から生成されました)

Array
(
    [1] => Array
        (
            [boo] => hello
            [yeah] => world
        )    
)

私はこのシャッフル関連機能を使用しています:

function shuffle_assoc($list) { 
  if (!is_array($list)) return $list; 

  $keys = array_keys($list); 
  shuffle($keys); 
  $random = array(); 
  foreach ($keys as $key) { 
    $random[] = $list[$key]; 
  }
  return $random; 
}

$test = shuffle_assoc($array);

echo "<pre>";
print_r($test);
echo "</pre>";

そして、私はこれを取得します:

Array
(
    [0] => Array
        (
            [boo] => hello // I'm trying to switch
            [yeah] => world // these two values
        )    
)

シャッフル機能が切り替わらず[boo][yeah]

誰かが私を助けることができますか?

4

3 に答える 3

0

配列の最初のレベルをスキップする必要があります。

$array = array(1 => array('boo' => 'hello', 'yeah' => 'world', 'foo' => 'bar'));
function shuffle_assoc($list) {
    foreach ($list as $idx => &$sub_array) { // we actually loop over the numeric indexes since that's the first level
        $keys = array_keys($sub_array);
        $vals = array_values($sub_array);
        shuffle($vals);
        $sub_array = array_combine($keys, $vals);
    }
    return $list;
}
$new_arr = shuffle_assoc($array);
var_export($new_arr);

出力

array (
  1 => 
  array (
    'boo' => 'bar',
    'yeah' => 'hello',
    'foo' => 'world',
  ),
)
于 2012-12-11T06:03:16.790 に答える
0

渡した配列は、実際には1つの要素を持つ配列の配列のようです。このメソッドはで呼び出す必要があります$array[1]

また、shuffle_assocでは、ステートメント$random[] = $list[$key]はキー値を保持しないため、結果の配列には元の配列の値のみが含まれます。そのコード行をに変更すると$random[$key] = $list[$key]、関数が修正されます。以下は私のために働いたいくつかのコードです。

<?php
$array = array("boo" => "hello", "yeah" => "world");
function shuffle_assoc($list) { 
  if (!is_array($list)) return $list; 

  $keys = array_keys($list); 
  shuffle($keys); 
  $random = array(); 
  foreach ($keys as $key) { 
    $random[$key] = $list[$key]; 
  }
  return $random; 
}

$test = shuffle_assoc($array);

print_r($test);
?>
于 2012-12-11T06:06:09.890 に答える
0

解決策を見つけました。

$test = shuffle_assoc(array_shift($array));

array_shift()最初の要素を持ってくるので、

Array
(
    [1] => Array
        (
            [boo] => hello
            [yeah] => world
        )    
)

Array
(
            [boo] => hello
            [yeah] => world
)

[1] がなくなったことに注意してください

于 2012-12-11T06:21:12.290 に答える