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

Group Multi-dimensional Array by Value(a) and sort each Group by Value(b)

我有一个数组,其中包含混合在一起的水果和蔬菜。我想按类型对每个项目进行分组,即 'vegetable'(由值 = 1 表示)或 'fruit'(由值 = 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"
  }
}

在'hopeful'结果中,可以看到字段'basket'有2组,即1 & 2 因此数组必须是 "ordered" 它是 'grouped' 顺序。

最后,每个 'group' 项目必须按其自己的顺序排序。

这是我目前所拥有的:

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

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

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

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

你只需要为相同的篮子设置条件并在有相同的篮子时明智地排序

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'];
}

从PHP5.3开始,可以使用匿名函数:

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

LIVE DEMO

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