【问题标题】:Shuffling my array洗牌我的阵列
【发布时间】:2012-12-11 05:48:58
【问题描述】:

我在洗牌时遇到了麻烦,希望有人可以指导我吗?

我有这个数组:(这个数组是由随机关联函数产生的)

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]

有人可以帮我吗?

【问题讨论】:

  • @Kafuka 抱歉,我使用的是 PHP。你问的是这个吗?

标签: php arrays shuffle


【解决方案1】:

你需要跳过数组的第一级。

$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',
  ),
)

【讨论】:

    【解决方案2】:

    看起来你传入的数组实际上是一个数组数组,有 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);
    ?>
    

    【讨论】:

      【解决方案3】:

      我找到了解决办法。

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

      array_shift() 带来第一个元素,所以它会从

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

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

      注意 [1] 现在是如何消失的

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-15
        • 1970-01-01
        • 1970-01-01
        • 2015-12-02
        • 2013-10-16
        • 1970-01-01
        相关资源
        最近更新 更多