基于字符串值对数组项进行分组

时间:2017-05-19 14:44:29

标签: php arrays

我正在尝试按sport对数组进行分组。这可能是n次运动。最后,然后用它创建一个新数组。是否有一种有效的方法可以避免过度杀伤?

$sports = [
    ['sport' => 'soccer', 'id' => 97487];
    ['sport' => 'soccer', 'id' => 244800];
    ['sport' => 'soccer', 'id' => 258740];
    ['sport' => 'basketball', 'id' => 147884];
    ['sport' => 'baseball', 'id' => 222240];
    ['sport' => 'baseball', 'id' => 222245];
];

初始数组:

array(6) {
  [0]=>
  array(2) {
    ["sport"]=>
    string(6) "soccer"
    ["id"]=>
    int(97487)
  }
  [1]=>
  array(2) {
    ["sport"]=>
    string(6) "soccer"
    ["id"]=>
    int(244800)
  }
  [2]=>
  array(2) {
    ["sport"]=>
    string(6) "soccer"
    ["id"]=>
    int(258740)
  }
  [3]=>
  array(2) {
    ["sport"]=>
    string(10) "basketball"
    ["id"]=>
    int(147884)
  }
  [4]=>
  array(2) {
    ["sport"]=>
    string(8) "baseball"
    ["id"]=>
    int(222240)
  }
  [5]=>
  array(2) {
    ["sport"]=>
    string(8) "baseball"
    ["id"]=>
    int(222245)
  }
}

期望的结果:

array(3) 
{
    [0]=>
    array(3) {
        [0]=>
        array(2) {
          ["sport"]=>
          string(6) "soccer"
          ["id"]=>
          int(97487)
        }
        [1]=>
        array(2) {
          ["sport"]=>
          string(6) "soccer"
          ["id"]=>
          int(244800)
        }
        [2]=>
        array(2) {
          ["sport"]=>
          string(6) "soccer"
          ["id"]=>
          int(258740)
        }
    }
    [1]=> 
        array(1) {
        [0]=>
        array(2) {
          ["sport"]=>
          string(10) "basketball"
          ["id"]=>
          int(147884)
        }
    }
    [2]=> 
    array(2) {
        [0]=>
        array(2) {
          ["sport"]=>
          string(8) "baseball"
          ["id"]=>
          int(222240)
        }
        [1]=>
        array(2) {
          ["sport"]=>
          string(8) "baseball"
          ["id"]=>
          int(222245)
        }
    }
}

2 个答案:

答案 0 :(得分:2)

您可以像这样对数组进行分组:

$sports = [
    ['sport' => 'soccer', 'id' => 97487],
    ['sport' => 'soccer', 'id' => 244800],
    ['sport' => 'soccer', 'id' => 258740],
    ['sport' => 'basketball', 'id' => 147884],
    ['sport' => 'baseball', 'id' => 222240],
    ['sport' => 'baseball', 'id' => 222245]
];

// we will build an array here where the key is the sport
// name and the value is an array of objects pertaining
// to that sport i.e. 'basketball' => [bb1, bb2, ...]

$array = array();

// now consider every sport object in your original array

foreach($sports as $key => $item)
{
   if (array_key_exists($item['sport'], $array)) {
     // we encountered this same sport in the past so we
     // know $array['sportName'] already exists and can
     // push right to it
     $array[$item['sport']][] = $item;
   } else {
     // we have never seen this sport before and now must
     // insert the sport into $array['sportName'] = []
     // and push this sport object to it
     $array[$item['sport']] = [$item];
   }
}

// since $array's keys are the names of the sports themselves, but
// you want the keys to be numeric, this will build a new array
// from just the values of $array which at this point contains
// grouped arrays of sport objects

$result = array_values($array);

// print the results for good measure :)

print_r($result);

这可以通过循环运动数组并构建第二个[sportName => arrayOfThatSport]数组来实现。在for循环中,我们正在检查此数组中是否已存在给定的运动。如果确实如此,那么将运动添加到该运动的相应阵列中。否则,在$array['sportName'] = [sportObject]处为该项运动创建一个新阵列。如果你考虑循环的几次迭代,你会看到我们要么总是添加到现有的$array['sportName']数组,要么在遇到我们以前从未见过的新运动时在这个位置创建一个新数组。这给了我们一个类似于[ "sport : [...], "sport2": [...] ]的最终数组,但在你的情况下你想要一个数值数组而不是一个关联数组,因此调用array_values

答案 1 :(得分:0)

这是我建议的解决方案。

$groupedSports = [];
foreach ($sports as $item) {
    if (empty($groupedSports[$item['sport']])) {
        $groupedSports[$item['sport']] = [];
    }
    $groupedSports[$item['sport']][] = $item;
}

简短说明:

  • 第1行:我们初始化一个空数组
  • 第2行:我们在原始数组上启动循环
  • 第3-5行:如果它是当前运动的第一次出现,我们会为该运动初始化一个空数组(避免警告)
  • 第6行:我们将当前项目分配给相应的数组