按自定义顺序对php数组进行排序

按自定义顺序对php数组进行排序,php,arrays,multidimensional-array,sorting,Php,Arrays,Multidimensional Array,Sorting,我有一个数组: Array ( [0] => Array ( [id] = 7867867, [title] = 'Some Title'), [1] => Array ( [id] = 3452342, [title] = 'Some Title'), [2] => Array ( [id] = 1231233, [title] = 'Some Title

我有一个数组:

Array ( 
    [0] => Array (
        [id] = 7867867,
        [title] = 'Some Title'),
    [1] => Array (
        [id] = 3452342,
        [title] = 'Some Title'),
    [2] => Array (
        [id] = 1231233,
        [title] = 'Some Title'),
    [3] => Array (
        [id] = 5867867,
        [title] = 'Some Title')
)
需要按特定顺序进行:

  • 3452342
  • 5867867
  • 7867867
  • 1231233
  • 我该怎么做呢?我以前对数组进行过排序,也读过很多其他关于数组的帖子,但它们总是基于比较(即valueA
    非常感谢您的帮助。

    您需要定义自己的比较函数并使用or,如果您想维护索引关联。

    您可以使用
    usort()
    来精确指示数组的排序方式。在这种情况下,可以在比较函数中使用
    $order
    数组

    下面的例子使用了一个简单的方法来简化生活

    $order = array(3452342, 5867867, 7867867, 1231233);
    $array = array(
        array('id' => 7867867, 'title' => 'Some Title'),
        array('id' => 3452342, 'title' => 'Some Title'),
        array('id' => 1231233, 'title' => 'Some Title'),
        array('id' => 5867867, 'title' => 'Some Title'),
    );
    
    usort($array, function ($a, $b) use ($order) {
        $pos_a = array_search($a['id'], $order);
        $pos_b = array_search($b['id'], $order);
        return $pos_a - $pos_b;
    });
    
    var_dump($array);
    
    这项工作的关键是要有被比较的值,即
    id
    s在
    $order
    数组中的位置

    比较功能的工作原理是在
    $order
    数组中查找要比较的两个项目的ID的位置。如果
    $a['id']
    $order
    数组中位于
    $b['id']
    之前,则函数的返回值将为负值(
    $a
    较小,因此“浮动”到顶部)。如果
    $a['id']
    位于
    $b['id']
    之后,则函数返回一个正数(
    $a
    较大,因此“下沉”)

    最后,使用闭包没有特殊的原因;这只是我快速编写这些一次性函数的方法。它同样可以使用普通的命名函数。

    扩展此附加要求:

    现在,当我将项目添加到数组而不是排序时会发生什么?我 不要在意它们出现的顺序,只要它们在后面 我确实指明了

    您需要在排序函数中添加两个附加条件:

  • “不在乎”项目必须被视为大于白名单项目
  • 两个“不在乎”项目必须视为相等
  • 因此,修订后的守则将是:

    $order=array(
    3452342,
    5867867,
    7867867,
    1231233
    );
    $array=array(
    数组(“id”=>7867867,“title”=>“必须是#3”),
    数组(“id”=>3452342,“title”=>“必须为#1”),
    数组(“id”=>1231233,“title”=>“必须是#4”),
    数组(“id”=>5867867,“title”=>“必须是#2”),
    数组(“id”=>1111111,“title”=>Dont Care#1”),
    数组(“id”=>2222222,“title”=>Dont Care#2”),
    数组(“id”=>3333333,“title”=>Don Care#3”),
    数组(“id”=>444,“title”=>Dont Care#4”)
    );
    洗牌($array);//用于测试
    变量转储($array);//之前
    usort($array,function($a,$b)use($order){
    $a=数组搜索($a[“id”],$order);
    $b=数组搜索($b[“id”],$order);
    如果($a==false&&$b==false){//这两项都不重要
    返回0;//a==b
    }否则如果($a==false){/$a是一个不关心的
    返回1;//$a>$b
    }否则,如果($b===false){/$b是a,则不必在意
    返回-1;//$a<$b
    }否则{
    返回$a-$b;//对$a和$b升序排序
    }
    });
    变量转储($array);//之后
    
    输出:

    之前|之后
    -------------------------------+-------------------------------
    数组(8){|数组(8){
    [0]=>                        |    [0]=>
    数组(2){|数组(2){
    [“id”]=>
    内部(444)|内部(3452342)
    [“标题”]=>|[“标题”]=>
    字符串(12)“不在乎4”字符串(10)“必须是1”
    }                            |    }
    [1]=>                        |    [1]=>
    数组(2){|数组(2){
    [“id”]=>
    国际(3333333)|国际(5867867)
    [“标题”]=>|[“标题”]=>
    字符串(12)“不在乎3”字符串(10)“必须是2”
    }                            |    }
    [2]=>                        |    [2]=>
    数组(2){|数组(2){
    [“id”]=>
    国际(1231233)|国际(7867867)
    [“标题”]=>|[“标题”]=>
    字符串(10)“必须是#4”|字符串(10)“必须是#3”
    }                            |    }
    [3]=>                        |    [3]=>
    数组(2){|数组(2){
    [“id”]=>
    内部(1111111)|内部(1231233)
    [“标题”]=>|[“标题”]=>
    字符串(12)“不在乎1”字符串(10)“必须是4”
    }                            |    }
    [4]=>                        |    [4]=>
    数组(2){|数组(2){
    [“id”]=>
    国际(5867867)|国际(2222222)
    [“标题”]=>|[“标题”]=>
    字符串(10)“必须是#2”|字符串(12)“不在乎#2”
    }                            |    }
    [5]=>                        |    [5]=>
    数组(2){|数组(2){
    [“id”]=>
    国际(2222222)|国际(1111111)
    [“标题”]=>|[“标题”]=>
    字符串(12)“不在乎2”字符串(12)“不在乎1”
    }                            |    }
    [6]=>                        |    [6]=>
    数组(2){|数组(2){
    [“id”]=>
    内部(3452342)|内部(3333333)
    [“标题”]=>|[“标题”]=>
    字符串(10)“必须是#1”|字符串(12)“不在乎#3”
    }                            |    }
    [7]=>                        |    [7]=>
    数组(2){|数组(2){
    [“id”]=>
    国际(7867867)|国际(444)
    [“标题”]=>|[“标题”]=>
    圣
    
    //tournament with goal to be first in array
        usort($champions, function ($home, $away) use ($order) {
            $home_attribute = array_search($a['id'], $order);
            $away_attribute = array_search($b['id'], $order);
            //fight with desired outcome for home being negative and away desiring positive
            return $home_attribute - $away_attribute;
        });
    
    // restructure with values as keys, and keys as order (ASC)
    $order = array_flip([3452342, 5867867, 7867867, 1231233]);
    // generating $order = [3452342 => 0, 5867867 => 1, 7867867 => 2, 1231233 => 3];
    
    $default = count($order);
    // generating $default = 4
    
    
    usort($array, function($a, $b) use($order, $default) {
        return ($order[$a['id']] ?? $default) <=> ($order[$b['id']] ?? $default);
    });
    
    var_export($array);
    
    $order = array(3452342, 5867867, 7867867, 1231233);
    $array = array(
        array('id' => 7867867, 'title' => 'Some Title'),
        array('id' => 3452342, 'title' => 'Some Title'),
        array('id' => 1231233, 'title' => 'Some Title'),
        array('id' => 5867867, 'title' => 'Some Title'),
    );
    
    $order = array_flip($order);
    $array = array_column($array,null,"id");
    $result = array_replace($order,$array);
    var_dump(array_values($result));
    
    $order = array(3452342, 5867867, 7867867, 1231233);
    $array = array(
        array('id' => 7867867, 'title' => 'Some Title'),
        array('id' => 3452342, 'title' => 'Some Title'),
        array('id' => 1231233, 'title' => 'Some Title'),
        array('id' => 5867867, 'title' => 'Some Title'),
    );
    
    $order_dict = array_flip($order);
    $order_dict = array_combine($order, array_fill(0, count($order), []));
    foreach($array as $item){
        $order_dict[$item["id"]][] = $item;
    }
    //$order_dict = array_filter($order_dict);  // if there is empty item on some id in $order array
    $result = [];
    foreach($order_dict as $items){
        foreach($items as $item){
            $result[] = $item;
        }
    }
    var_dump($result);
    
    fastsort     about  1 ms
    mediumsort   about  3 ms
    slowsort     about 60 ms