按另一个数组的值对数组进行排序

时间:2018-01-29 19:16:37

标签: php arrays sorting

我有一些来自Feed的杂乱数据,我正在试图找出如何正确排序。我在下面发布了一个简化示例。我想按组名称按字母顺序对人员数组进行排序。

$people = array( 
    "category_id_1" => array (
        "Mark",
        "Jenny",    
        "Andrew"
    ),
    "category_id_2" => array (
        "John",
        "Lewis",    
        "Andrea"
    ),
    "category_id_3" => array (
        "Hannah",
        "Angie",    
        "Raleigh"
    )
);

$categories = array( 
    "category_id_1" => "Group B",
    "category_id_2" => "Group C",
    "category_id_3" => "Group A"
);

理想情况下,最终结果是

$people = array( 
    "category_id_3" => array ( // Group A
        "Hannah",
        "Angie",    
        "Raleigh"
    ),
    "category_id_1" => array ( // Group B
        "Mark",
        "Jenny",    
        "Andrew"
    ),
    "category_id_2" => array ( // Group C
        "John",
        "Lewis",    
        "Andrea"
    )
);

我一直在旋转我的车轮一段时间了,而我最接近的就是这个uasort,它仍然没有做到这一点。

uasort($people, function ($a, $b) {
    return strcmp($categories[$a], $categories[$b]);
});

非常感谢您的帮助。

4 个答案:

答案 0 :(得分:1)

这可以通过利用array_replace

以更简单的方式实现
// Work on a copy just to be sure the rest of your code is not affected
$temp_categories = $categories;
// Sort categories by name
asort($temp_categories);
// Replace the values of the sorted array with the ones in $people
$ordered_people = array_replace($temp_categories, $people);

答案 1 :(得分:0)

您希望按键$people而不是其值进行排序。您可以使用uksort。此外,您需要在功能中使$categories可用。我更喜欢use;但你也可以把它变成一个全局变量。最终代码:

uksort($people, function ($a,$b) use ($categories) {
  return strcmp($categories[$a], $categories[$b]);
});

Manual for uksort

use language construct。在例3之前。

答案 2 :(得分:-1)

试试这个(测试和工作):

asort($categories);
$sorted = array();
foreach ($categories as $key => $value)
  $sorted[$key]=$people[$key];

更短的方法:(测试和工作)

asort($categories);
$result = array_merge($categories,$people);

第二种方法利用了这样一个事实:当键相同时,array_merge函数将第一个数组中的值替换为第二个数组中的值。
警告 如果密钥是数字,则第二种方法无效。只使用字符串键。此外,如果categories数组在people数组中没有相应条目的条目,则它们将被复制到结果

要解决此问题,我们使用array_replace:

asort($categories);
$result = array_replace($categories,$people);
Var_dump($result);// tested and working

答案 3 :(得分:-1)

我认为你需要的是Asort类别以及在foreach中使用排序数组。

Asort($categories);

Foreach($categories as $key => $group){
    $new[$key] =$people[$key];
}
Var_dump($new);

https://3v4l.org/kDAQW

输出:

array(3) {
  ["category_id_3"]=> array(3) {
    [0]=> "Hannah"
    [1]=> "Angie"
    [2]=> "Raleigh"
  }
  ["category_id_1"]=> array(3) {
    [0]=> "Mark"
    [1]=> "Jenny"
    [2]=> "Andrew"
  }
  ["category_id_2"]=>array(3) {
    [0]=> "John"
    [1]=> "Lewis"
    [2]=> "Andrea"
  }
}