如何通过定义键顺序重新排列数组?

时间:2015-09-25 10:02:14

标签: php arrays sorting multidimensional-array

我有一个多维数组,我想用数组定义每个subArray的键的顺序。让我举个例子。

输入数组:

$array = array(
           array( "version" => 1, "IP" => 1111, "name" => "bbb"),
           array( "version" => 3, "IP" => 1112, "name" => "aaa"),
           array( "version" => 2, "IP" => 1113, "name" => "ccc")
         );

我想做这样的事情:

$a_array = sort_headers($array, array("name", "version", "IP"));

我的预期输出是(看看按照上面传递的数组改变了键的顺序):

$a_array = array(
               array("name" => "bbb", "version" => 1, "IP" => 1111),
               array("name" => "aaa", "version" => 3, "IP" => 1112),
               array("name" => "ccc", "version" => 2, "IP" => 1113)
             );

如果答案是代码较少或最佳优化答案,那就太棒了!

1 个答案:

答案 0 :(得分:1)

这应该适合你:

为每个subArray使用array_replace()重新排列元素。使用$header作为第一个参数并使用array_flip()它,以便值是键,它们定义键的顺序。

然后在数组($header)中找到的每个键都将填充它的值(每个subArray,$v)。

例如:

Header / Key order:
       Array ( [name] =>   [version] =>   [IP] =>   ) 
                         ↑              ↑         ↑
                         └──┐           │       ┌─┘
                         ┌──┼───────────┘       │
                         │  └───────────────────┼──┐
                         │          ┌───────────┘  │
                         |          │              |
    Array ( [version] => 1 [IP] => 1111 [name] => bbb ) 
(Each) Array:

---------------------
Result:
       Array ( [name] => bbb [version] => 1 [IP] => 1111 ) 

代码:

<?php

    $header = array("name", "version", "IP");

    $array = array_map(function($v)use($header){
        return array_replace(array_flip($header), $v);
    }, $array);

?>