2017-03-09 136 views
0

不知道我错过了某些显而易见的事情,但我无法在其他答案中找到排序多维数组子组的方法,而无需触摸主要顺序。仅对多维数组进行PHP排序子组

我有一个数组这样

Array 
(
    [1] => Array 
     (
      [name] => Apples 
      [type] => 1 
      [sales] => 10 
     ) 

    [2] => Array 
     (
      [name] => Apples 
      [type] => 2 
      [sales] => 30 
     ) 

    [3] => Array 
     (
      [name] => Apples 
      [type] => 3 
      [sales] => 20 
     ) 

    [4] => Array 
     (
      [name] => Oranges 
      [type] => 1 
      [sales] => 30 
     ) 

    [5] => Array 
     (
      [name] => Oranges 
      [type] => 2 
      [sales] => 10 
     ) 

    [6] => Array 
     (
      [name] => Oranges 
      [type] => 3 
      [sales] => 20 
     ) 

    [7] => Array 
     (
      [name] => Lemons 
      [type] => 1 
      [sales] => 10 
     ) 

    [8] => Array 
     (
      [name] => Lemons 
      [type] => 2 
      [sales] => 30 
     ) 

    [9] => Array 
     (
      [name] => Lemons 
      [type] => 3 
      [sales] => 20 
     ) 
) 

我需要做的就是通过密钥“销售”排序每个“名”组(苹果,橙子和柠檬),剩下的键“名称的顺序“苹果,橙子和柠檬不变,所以结果应该是这样的:

Array 
(
    [1] => Array 
     (
      [name] => Apples 
      [type] => 1 
      [sales] => 10 
     ) 

    [2] => Array 
     (
      [name] => Apples 
      [type] => 3 
      [sales] => 20 
     ) 

    [3] => Array 
     (
      [name] => Apples 
      [type] => 2 
      [sales] => 30 
     ) 

    [4] => Array 
     (
      [name] => Oranges 
      [type] => 2 
      [sales] => 10 

     ) 

    [5] => Array 
     (
      [name] => Oranges 
      [type] => 3 
      [sales] => 20 
     ) 

    [6] => Array 
     (
      [name] => Oranges 
      [type] => 1 
      [sales] => 30 
     ) 

    [7] => Array 
     (
      [name] => Lemons 
      [type] => 1 
      [sales] => 10 
     ) 

    [8] => Array 
     (
      [name] => Lemons 
      [type] => 3 
      [sales] => 20 
     ) 

    [9] => Array 
     (
      [name] => Lemons 
      [type] => 2 
      [sales] => 30 
     ) 
) 

我找不到任何方式做到这一点,任何人都可以给我一个关于这个提示?

谢谢!

+2

'usort','usort','首先的usort' –

+0

@gege安排你的数组中的PHP的形式,告诉你试过吗? –

+1

您发布的“代码”中的数组结构不清楚。请发布一个有效的php arrray定义。 – arkascha

回答

1

@gege试试这个:

<?php 
    $arr = array(
       array(
         "name" => "Apples", 
         "type" => 1, 
         "sales" => 10 
        ), 
       array(
         "name" => "Apples", 
         "type" => 2, 
         "sales" => 30 
        ), 
       array(
         "name" => "Apples", 
         "type" => 3, 
         "sales" => 20 
        ), 
       array(
         "name" => "Oranges", 
         "type" => 1, 
         "sales" => 30 
        ), 
       array(
         "name" => "Oranges", 
         "type" => 2, 
         "sales" => 10 
        ), 
       array(
         "name" => "Oranges", 
         "type" => 3, 
         "sales" => 20 
        ), 
       array(
         "name" => "Lemons", 
         "type" => 1, 
         "sales" => 10 
        ), 
       array(
         "name" => "Lemons", 
         "type" => 2, 
         "sales" => 30 
        ), 
       array(
         "name" => "Lemons", 
         "type" => 3, 
         "sales" => 20 
        ) 
      ); 
    echo "<pre>"; 
    print_r($arr); // array before 

    function sortArr($a, $b){ 
     if($a["name"] == $b["name"]){ 
      if($a["sales"] == $b["sales"]){ 
       return 0; 
      } 
      return($a["sales"] < $b["sales"] ? -1 : 1); 
     } 
     else{ 
      return($a["name"] < $b["name"] ? -1 : 1); 
     } 
    } 

    usort($arr, "sortArr"); 
    echo "<pre>"; 
    print_r($arr); // array after 
+0

谢谢你这个作品!我现在必须明白它是如何实现的,不管怎样,PHP排序数组的方式似乎让我感到困惑,我没有考虑像在两个层次上使用它。很棒,现在有时间学习并理解它,谢谢! – gege

+0

欢迎您:-) –

1

为了便于阅读,我减少了你的数组(它应该仍然适用于你的)。

<?php 
// The array structured as assumed according to your example 
$groceries = array(
    array(
     "name" => "Apples", 
     "type" => 1, 
     "sales" => 10 
    ), 
    array(
     "name" => "Apples", 
     "type" => 2, 
     "sales" => 30 
    ), 
    array(
     "name" => "Apples", 
     "type" => 3, 
     "sales" => 20 
    ), 
); 


/** 
* See the PHP docs for more information: http://php.net/manual/en/function.usort.php 
*/ 
$sortBySales = function ($a, $b){ 
    return $a['sales'] - $b['sales']; 
}; 


echo "<h1>Unsorted</h1>"; 
echo "<pre>"; 
    var_dump($groceries); 
echo "</pre>"; 

usort($groceries, $sortBySales); 

echo "<h1>Sorted</h1>"; 
echo "<pre>"; 
    var_dump($groceries); 
echo "</pre>"; 

编辑

我忘了,该阵列应该有名称分组为好。现在,@BunkerBoy alread张贴的解决方案,但对于completness的缘故,这里是更新排序功能:

$sortBySales = function ($a, $b){ 
    if($a["name"] == $b["name"]){ 
     return $a['sales'] - $b['sales']; 
    }else{ 
     return($a["name"] < $b["name"] ? -1 : 1); 
    } 
}; 

注意,要@BunkerBoy的功能,唯一的区别是,我减少了比较的计算。

+0

嗨,感谢您的建议,但它不起作用,因为我的主要需求是将子项“名称”分组。按照我的示例展开数组并使用您的代码结果并不是我所需要的,因为它会改变“苹果”和“桔子”的混合顺序。我需要所有'苹果'和所有'桔子'按照原始顺序(所有苹果,然后是所有桔子,然后是所有柠檬)一个接一个地排序,但是按销售排序这些组中的每一个,所以首先通过销售,然后是所有的橙子,然后是所有的柠檬(尝试将你的代码应用到我的原始数组,你会看到与我需要的结果不同)。 – gege

+0

噢,是的,对不起,我忘了 - 但似乎@BunkerBoy已经解决了这个问题:-) – mcuenez

+1

谢谢你,你的变化将有助于理解过程,因为它产生相同的结果,以一种稍微不同的方式! :) – gege