【问题标题】:How to achieve multidimensional array flatten in php?如何在php中实现多维数组展平?
【发布时间】:2021-09-17 12:01:26
【问题描述】:

我可以解释我到底想要什么。

假设我有五门科目(A、B、C、D、E),每个科目从周一到周五每天都有考试(即 5 天时段)。所以 $buckets 数组看起来像这样:

$buckets = [
  [A2, B2, C2, D2, E2],
  [C3, A3, D3, B3, E3],
  [B4, D4, C4, E4, A4],
  [E5, B5, C5, A5, D5],
  [A6, B6, D6, C6, E6],
];

按主题分开后,我最终得到:

$subjects = [
  'A' => [A2, A3, A4, A5, A6],
  'B' => [B2, B3, B4, B5, B6],
  'C' => [C2, C3, C4, C5, C6],
  'D' => [D2, D3, D4, D5, D6],
  'E' => [E2, E3, E4, E5, E6],
];

现在我想要的是,从上面到数组,我想像这样展平:

$buffers = [
  [A2, B2, C2, D2, E2],
  [A3, B3, C3, D3, E3],
  [A4, B4, C4, D4, E4],
  [A5, B5, C5, D5, E5],
  [A6, B6, C6, D6, E6],
]

然后,如果我将其展平并选择前五个,我最终只会得到周一的考试,而其他日子则没有。

我想要的期望输出是,应该涵盖多天和多个主题并且是唯一的;在这种情况下,一种可能的选择可能是 [B2, D3, A4, E5, C6](即每天选择一个,每天随机选择不同的主题)。

关于如何实现这一目标的任何建议? 基本上我想在这里做两件事,如何生成 $buffer 数组以及如何从中获得所需的输出。

谢谢!

【问题讨论】:

    标签: php


    【解决方案1】:

    从您的最终缓冲区开始,我将使用范围和随机播放生成一个随机数数组以提取所需的输出:

    $buffers = [
      ["A2", "B2", "C2", "D2", "E2"],
      ["A3", "B3", "C3", "D3", "E3"],
      ["A4", "B4", "C4", "D4", "E4"],
      ["A5", "B5", "C5", "D5", "E5"],
      ["A6", "B6", "C6", "D6", "E6"],
    ];
    
    
    $final = [];
    $values = range(0, 4);
    shuffle($values);
    
    $count = 0;
    foreach ($buffers as $line)
       $final[] = $line[$values[$count++]];
    
    print(implode(", ", $final));
    print("\n\n");
    

    一些输出:

    E2, D3, A4, C5, B6
    B2, C3, E4, A5, D6
    E2, B3, C4, D5, A6
    E2, D3, C4, A5, B6
    D2, E3, C4, B5, A6
    B2, C3, D4, A5, E6
    C2, E3, A4, B5, D6
    D2, B3, A4, E5, C6
    B2, A3, C4, D5, E6
    A2, E3, D4, C5, B6
    B2, D3, A4, E5, C6
    E2, C3, A4, B5, D6
    

    【讨论】:

    • 您好 DP,感谢您的回答。但我很抱歉造成混乱,我也没有 $buffer 数组,或者我应该如何生成它?随着你提到的洗牌,我不会收到独特的结果。我在您的输出中看到重复项。您能否建议随机但独特的输出?再次感谢。
    【解决方案2】:

    我以为您已经有了将 $buckets 转换为 $buffers 的代码。你可以试试这些:

    $buckets = [
      ["A2","B2","C2","D2","E2"],
      ["C3","A3","D3","B3","E3"],
      ["B4","D4","C4","E4","A4"],
      ["E5","B5","C5","A5","D5"],
      ["A6","B6","D6","C6","E6"],
    ];
    
    $subjects = [];
    foreach ($buckets as $items) {
        foreach ($items as $item) {
           $subject = substr($item, 0, 1);
           $subjects[$subject][] = $item;
        }
    }
     
    $buffers = [];
    foreach ($subjects as $items) {
        foreach ($items as $item) {
           $number = substr($item, 1, 1);
           $buffers[$number][] = $item;
        }
    }
    

    shuffle() 的随机性如何? 您可以尝试使用alternative 方法来提高随机性。我做了一些修改,称之为 shuffle2():

    function shuffle2(&$array) {
        $len = count($array);
        $randomArray = [];
        while (count($randomArray) < $len) {
           $randomKey = mt_rand(0, count($array)-1);
           $randomArray[$randomKey] = $array[$randomKey];
        }
        $array =  array_values($randomArray);
     }
    

    将所有行输出附加到一个数组中,并使用 array_unique() 删除重复项。

    您可能看不到多少改进,因为您只有 5 个主题要随机播放。

    【讨论】:

    • 太棒了!万分感谢!我会尽力让你知道。是否有效。
    猜你喜欢
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    • 2010-11-22
    相关资源
    最近更新 更多