【问题标题】:Sorting a PHP array by a predefined order按预定义的顺序对 PHP 数组进行排序
【发布时间】:2015-06-16 21:20:51
【问题描述】:

我有这个数组:

$categories = array(1,19,4,33,10,7,12);

还有这个数组:

$order = array(33,12,50,19,4,1,100,18,9,2,7);

我想要$categoriesprefined 中的$order 的方式排序。所以我需要的结果是:

$categories_sorted = array(33,12,19,4,1,7,10);

您可能已经注意到,10 不在$order 中。这是因为$order 数组中永远不会包含所有类别,只有最重要的类别。 $categories_sorted 数组应始终包含来自 $categories 的所有值,即使它们不在 $sorted 中。

【问题讨论】:

标签: php arrays sorting


【解决方案1】:

我希望这能完成你的挑战:

$categories = array(1, 19, 4, 33, 10, 7, 12);
$order = array(33, 12, 50, 19, 4, 1, 100, 18, 9, 2, 7);
$categories_sorted = array();

// first: sort what is in $categories based on $order

foreach($order as $key => $value) {
    if(in_array($value, $categories)) $categories_sorted[] = $value;
}

// then add what is in $categories but bot in $order

foreach($categories as $key => $value) {
    if(!in_array($value, $order)) $categories_sorted[] = $value;
}

【讨论】:

    【解决方案2】:

    你可以使用php的uasort函数作为

    $categories = array(1, 19, 4, 33, 10, 7, 12);
    $order = array(33, 12, 50, 19, 4, 1, 100, 18, 9, 2, 7);
    
    uasort($categories, function($a, $b)use(&$order) {
        foreach ($order as $key => $value) {
            if ($a == $value) {
                return 0;
                break;
            }
            if ($b == $value) {
                return 1;
                break;
            }
        }
    });
    
    print_r($categories);
    

    Fiddle

    【讨论】:

    • 你得到答案了吗
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 2014-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多