【问题标题】:PHP sort 2d string array by specific order arrayPHP按特定顺序数组排序二维字符串数组
【发布时间】:2015-04-07 23:30:58
【问题描述】:

我是 php 新手,一直在尝试使用特定顺序数组对二维字符串数组进行排序。一直在考虑使用“usort”和“comparison”,但在使用二维数组和字符串时似乎无法理解它们。

需要将数组输入到方法并返回排序后的数组,格式相同。因此,对于数组中的每个条目,它将根据订单数组的顺序对第二级“文件”值进行排序。有什么建议可以做到这一点吗?

//actual array to be sorted by 'file'
$Array ( 
[0] => Array ( [source] => img/table/icon/toxic.svg [file] => toxic ) 
[1] => Array ( [source] => img/table/icon/health.svg [file] => health ) 
[2] => Array ( [source] => img/table/icon/irritant.svg [file] => irritant   ));

//order array with desired sort order
$order = array("irritant","corrosive","environment" ,"health","toxic","oxidizing","flammable","explosive","gas");

//Desired Output Result
$Array ( 
[0] => Array ( [source] => img/table/icon/irritant.svg [file] => irritant )
[1] => Array ( [source] => img/table/icon/health.svg [file] => health ) 
[2] => Array ( [source] => img/table/icon/toxic.svg [file] => toxic ) );

看到刺激性在前,毒性在后:)

【问题讨论】:

    标签: php arrays sorting multidimensional-array


    【解决方案1】:

    这可以通过巧妙地使用 PHP 的 usort 函数来实现。您的调用可能如下所示:

    $order = array("irritant","corrosive","environment" ,"health","toxic","oxidizing","flammable","explosive","gas");
    usort($array, function ($a, $b) use ($order) {
        $aOrder = array_search($a['file'], $order);
        $bOrder = array_search($b['file'], $order);
        if ($aOrder == $bOrder) return 0;
        return ($aOrder > $bOrder) ? 1 : -1;
    });
    

    【讨论】:

    • 这样用起来效率高吗?刚试了一下,打印结果时得到一个空数组...问题只是我的理解。
    • 它在大型数组上比在原始 PHP 中更高效,因为 usort() 既可以就地执行它,也可以使用 C,使其更节省内存和时间。跨度>
    【解决方案2】:

    基本方法是遍历数组和顺序数组,然后将键重新分配到一个新数组中...

    <?php
        $a[] = array('source' => 'img/table/icon/toxic.svg','file'=>'toxic');
        $a[] = array('source' => 'img/table/icon/health.svg','file'=>'health');
        $a[] = array('source' => 'img/table/icon/irritant.svg','file'=>'irritant');
    
        $b = array();
    
        $order = array("irritant","corrosive","environment","health","toxic","oxidizing","flammable","explosive","gas");
    
        foreach ($a as $arr) {
            foreach ($order as $key => $o) {
                if ($o == $arr['file']) {
                    $b[$key] = $arr;
                    break;
                }
            }
        }
        ksort($b);
        print_r(array_values($b)); // or print_r($b); if you dont want sequential keys
    ?>
    

    输出:

    Array ( 
    [0] => Array ( [source] => img/table/icon/irritant.svg [file] => irritant ) 
    [1] => Array ( [source] => img/table/icon/health.svg [file] => health ) 
    [2] => Array ( [source] => img/table/icon/toxic.svg [file] => toxic )
    )
    

    【讨论】:

    • 谢谢,这是一种享受……看起来很简单,但我花了一段时间才弄清楚如何使用 arrayflip 和 ksort。
    • 你甚至不需要array_flip... 看我最后的编辑。没有它也可以做到。也很高兴我能提供帮助。 xathien 建议的 usort 方法也可以,但是对于 PHP 新手来说,什么都解释不了。
    猜你喜欢
    • 2013-07-19
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    • 2011-12-19
    相关资源
    最近更新 更多