PHP根据特定的顺序数组对2d字符串数组进行排序


PHP sort 2d string array by specific order array

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

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

//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的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
    $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 )
)