【问题标题】:Count how many times a value occurs with another value in a multidimensional array | PHP计算一个值在多维数组中与另一个值一起出现的次数 | PHP
【发布时间】:2022-01-25 04:07:43
【问题描述】:

所以我有这个多维数组,我想做的是获取一个值与另一个值出现的次数。

例如:

Ball、Jungle 和 Car 同时出现 2 次,Ball 和 Car 同时出现 3 次,Ball 和 Jungle 同时出现 3 次,Ball 和 Sea 同时出现 2 次 .... Sea 和 Jungle 同时出现 1 次 ... .

一个数组可能有 3 个元素,另一个可能有 8 个元素。

有可能实现吗?

 array(5) {
          [0]=>
          array(3) {
            [0]=>
            string(4) "Ball"
            [1]=>
            string(6) "Jungle"
            [2]=>
            string(3) "Sea"
            [3]=>
            string(3) "Fish"

          }
          [1]=>
          array(3) {
            [0]=>
            string(3) "Sea"
            [1]=>
            string(4) "Ball"
            [2]=>
            string(3) "Car"
          }
          [2]=>
          array(3) {
            [0]=>
            string(5) "Jungle"
            [1]=>
            string(4) "Ball"
            [2]=>
            string(3) "Car"
    
          }
       [3]=>
          array(3) {
            [0]=>
            string(5) "Jungle"
            [1]=>
            string(4) "Ball"
            [2]=>
            string(3) "Car"
    
          }
    
         }

【问题讨论】:

  • 您能否展示您解决问题的尝试,以便我们提供帮助?顺序重要吗?前任。 jungle, ball, car 对比。 ball, jungle, car?每个数组中总是有 3 个元素吗?输出应该是什么样子?
  • 顺序无所谓,有些数组的元素超过3个

标签: php arrays multidimensional-array


【解决方案1】:
$items = [
    [ "Ball", "Jungle", "Sea" ],
    [ "Sea", "Ball", "Car", "Heaven", "Sky", "Beach", "Thunder", "Cave" ],
    [ "Jungle", "Ball", "Car", "More" ],
    [ "Jungle", "Sky", "Ball", "Car", "Thunder" ]
];

function combinations(array $items): array {
  $result = [ [] ];
  foreach ($items as $item) {
    foreach ($result as $values) {
      $elements = array_merge([ $item ], $values);
      sort($elements);
      $result[] = $elements;
    }
  }
  return $result;
}

function count_combinations(array $items): array {
  $data = [];
  foreach ($items as $item) {
    $data = array_merge($data, combinations($item));
  }
  $data = array_filter($data);
  $data = array_map(fn($value) => implode('–', $value), $data);
  sort($data);
  return array_count_values($data);
}

print_r(count_combinations($items));

【讨论】:

    【解决方案2】:
    $items = [
        [ "Ball", "Jungle", "Sea" ],
        [ "Sea", "Ball", "Car" ],
        [ "Jungle", "Ball", "Car" ],
        [ "Jungle", "Ball", "Car" ]
    ];
    
    $data = [];
    
    foreach ($items as $item) {
    
      sort($item);
    
      // 3
      $data[] = implode('–', $item);
      // 2
      $data[] = implode('–', [ $item[0], $item[1] ]);
      $data[] = implode('–', [ $item[0], $item[2] ]);
      $data[] = implode('–', [ $item[1], $item[2] ]);
      // 1
      $data[] = $item[0];
      $data[] = $item[1];
      $data[] = $item[2];
    
    }
    
    sort($data);
    
    $result = array_count_values($data);
    
    print_r($result);
    

    这将打印:

    Array
    (
        [Ball] => 4
        [Ball–Car] => 3
        [Ball–Car–Jungle] => 2
        [Ball–Car–Sea] => 1
        [Ball–Jungle] => 3
        [Ball–Jungle–Sea] => 1
        [Ball–Sea] => 2
        [Car] => 3
        [Car–Jungle] => 2
        [Car–Sea] => 1
        [Jungle] => 3
        [Jungle–Sea] => 1
        [Sea] => 2
    )
    

    【讨论】:

    • 这很好用,但例如一个数组有 3 个元素,另一个有 8 个
    • 好吧,你的示例数组和你的帖子都没有这么说......
    • 我对我的问题进行了编辑,以便更清楚地了解我的问题,但您的回答将非常感谢!
    • 我刚刚发布了第二个解决方案,反映了对不同子数组长度的需求。
    猜你喜欢
    • 1970-01-01
    • 2023-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    相关资源
    最近更新 更多