【问题标题】:Group Multi-dimensional Array by Value(a) and sort each Group by Value(b)按值对多维数组进行分组(a)并按值对每个组进行排序(b)
【发布时间】:2018-03-01 11:47:03
【问题描述】:

我有一个包含混合在一起的水果和蔬菜的数组。我想按它们的类型对每个项目进行分组,即“蔬菜”(由值 = 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"
  }
}

在'hopeful'结果中,可以看出字段'basket'有2组,分别是1 & 2 因此数组必须是“有序”的,它是按顺序“分组”的。

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

这是我目前所拥有的:

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

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

【问题讨论】:

  • 你怎么知道哪一个是fruit,哪一个是vegetable?在你的数组中没有什么可以像这样区分的
  • @AlivetoDie 篮子接缝为 1 用于水果和 2 用于蔬菜
  • @Alive to Die 实际上这并不重要。专注于“处理”这一区别的领域是“篮子”领域。换句话说,这些项目需要按“篮子”分组,然后每个“篮子”项目必须按其分配的“位置”排序。这是否有助于澄清和回答您的问题?
  • @MacBooc 100% 正确!

标签: php sorting multidimensional-array grouping usort


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 也可以缩短为:function sort_myarray($a,$b) { return $a['basket'] - $b['basket'] ?: $a['position'] - $b['position']; }
    • @B.德赛 谢谢!我还要感谢 Casimir et Hippolyte 和其他人。
    • 为什么会被否决? @Downvoter 你能解释一下吗?这样我就可以纠正我的错误
    • @JacquesJoubert。如果它解决了问题,那么接受/支持答案。这样它也可以帮助其他人
    • 答案和我的一样。错过了几分钟。
    【解决方案3】:

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

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

    LIVE DEMO

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-15
      • 2013-04-03
      • 2013-02-06
      • 1970-01-01
      • 2021-07-11
      相关资源
      最近更新 更多