按值(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");
编辑
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'];
});
这与 B. Desai & Casimir et Hippolyte 提供的解决方案相结合
我有一个数组,其中包含混合在一起的水果和蔬菜。我想按类型对每个项目进行分组,即 '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");
编辑
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'];
});
这与 B. Desai & Casimir et Hippolyte 提供的解决方案相结合