按值(a)对多维数组进行分组,并按值(b)对每个组进行排序

时间:2017-09-20 12:07:01

标签: php sorting multidimensional-array grouping usort

我有一个包含水果和蔬菜的阵列,它们都是混合在一起的。我想按类型对每个项目进行分组,即“蔬菜”(由值= 1表示)或“水果”(由值= 2表示),然后按照分配给它的顺序放置每个项目。

这是我的起始数组:

array(3) {
  [0]=>
  array(16) {
    ["name"]=> "apples"
    ["position"]=> "1"
    ["basket"]=> "2"
  }
  [1]=>
  array(16) {
    ["name"]=> "potatoes"
    ["position"]=> "2"
    ["basket"]=> "1"
  }
  [2]=>
  array(16) {
    ["name"]=> "onions"
    ["position"]=> "1"
    ["basket"]=> "1"
  }
  [3]=>
  array(16) {
    ["name"]=> "oranges"
    ["position"]=> "3"
    ["basket"]=> "2"
  }
  [4]=>
  array(16) {
    ["name"]=> "tomatoes"
    ["position"]=> "4"
    ["basket"]=> "1"
  }
  [5]=>
  array(16) {
    ["name"]=> "grapes"
    ["position"]=> "5"
    ["basket"]=> "2"
  }
  [6]=>
  array(16) {
    ["name"]=> "avocado"
    ["position"]=> "2"
    ["basket"]=> "2"
  }
  [7]=>
  array(16) {
    ["name"]=> "bean"
    ["position"]=> "5"
    ["basket"]=> "1"
  }
  [8]=>
  array(16) {
    ["name"]=> "pineapple"
    ["position"]=> "4"
    ["basket"]=> "2"
  }
  [9]=>
  array(16) {
    ["name"]=> "pepper"
    ["position"]=> "3"
    ["basket"]=> "1"
  }
}

以下是我想要实现的结果:

array(3) {
  [0]=>
  array(16) {
    ["name"]=> "onions"
    ["position"]=> "1"
    ["basket"]=> "1"
  }
  [1]=>
  array(16) {
    ["name"]=> "potatoes"
    ["position"]=> "2"
    ["basket"]=> "1"
  }
  [2]=>
  array(16) {
    ["name"]=> "pepper"
    ["position"]=> "3"
    ["basket"]=> "1"
  }
  [3]=>
  array(16) {
    ["name"]=> "tomatoes"
    ["position"]=> "4"
    ["basket"]=> "1"
  }
  [4]=>
  array(16) {
    ["name"]=> "bean"
    ["position"]=> "5"
    ["basket"]=> "1"
  }
  [5]=>
  array(16) {
    ["name"]=> "apples"
    ["position"]=> "1"
    ["basket"]=> "2"
  }
  [6]=>
  array(16) {
    ["name"]=> "avocado"
    ["position"]=> "2"
    ["basket"]=> "2"
  }
  [7]=>
  array(16) {
    ["name"]=> "oranges"
    ["position"]=> "3"
    ["basket"]=> "2"
  }
  [8]=>
  array(16) {
    ["name"]=> "pineapple"
    ["position"]=> "4"
    ["basket"]=> "2"
  }
  [9]=>
  array(16) {
    ["name"]=> "grapes"
    ["position"]=> "5"
    ["basket"]=> "2"
  }
}

在“有希望”的结果中,可以看出“篮子”字段有 2 组,即 1 & 2 ,因此必须“排序”数组,使其按顺序“分组”。

最后,每个“组”项必须按照自己的顺序排序。

这就是我到目前为止:

uasort($array, function($a, $b) {return $a['basket'] - $b['basket'];});

我可以根据自己的需要进行调整吗?

3 个答案:

答案 0 :(得分:2)

从PHP 5.3开始,可以使用匿名函数:

uasort($array, function($a,$b)
    {
        return $a['basket'] - $b['basket'] ?: $a['position'] - $b['position'];
    });

LIVE DEMO

这与B. Desai& Sons提供的解决方案相结合。 Casimir et Hippolyte

答案 1 :(得分:1)

你必须为同一个篮子放置条件并且在有同一个篮子时明智地排序

function sort_myarray($a,$b)
{
    if($a['basket'] == $b['basket']) 
    {
        return $a['position'] - $b['position']; 
    }
    else {
        return $a['basket'] - $b['basket'];
    }
}
uasort($array,"sort_myarray");

LIVE DEMO

修改

正如Casimir et Hippolyte建议你也可以通过

来缩短代码
function sort_myarray($a,$b)
{
     return $a['basket'] - $b['basket'] ?: $a['position'] - $b['position'];
}

答案 2 :(得分:0)

可能不是最好的方法,但试试这个:

$a = "your array";

function sort_by_position($a, $b)
{
    return $a['position'] - $b['position'];
}

usort($a, 'sort_by_position');

$b = [];

foreach ($a as $k=>$v) {
  $b[$v['basket']][] = $a[$k];
}

print_r($b)