php按自定义顺序排序multidimentional数组

aga*_*ggi 2 php arrays sorting multidimensional-array

按一个键值(asc或desc)对多维数组进行排序的次数要求太多.但我没有找到任何解决我的问题的方法,你必须通过预定义的自定义顺序中的一个键值对多维数组进行排序.

以数组为例

$array[0] = array('id'=> '111', value=>'abc');
$array[1] = array('id'=> '100', value=>'abc');
$array[2] = array('id'=> '132', value=>'abc');
$array[3] = array('id'=> '222', value=>'abc');
$array[4] = array('id'=> '112', value=>'abc');
$array[5] = array('id'=> '200', value=>'abc');
Run Code Online (Sandbox Code Playgroud)

并按下面数组中定义的顺序按子键'id'对此数组进行排序:

$sort_order_id = array('112','111','132','100');
Run Code Online (Sandbox Code Playgroud)

所以结果会是

$array[0] = array('id'=> '112', value=>'abc');
$array[1] = array('id'=> '111', value=>'abc');
$array[2] = array('id'=> '132', value=>'abc');
$array[3] = array('id'=> '100', value=>'abc');
$array[4] = array('id'=> '222', value=>'abc');
$array[5] = array('id'=> '200', value=>'abc');
Run Code Online (Sandbox Code Playgroud)

注意:如果某些id在$ sort_order_id数组中不可用,请将它们保留在最后(如上例所示,id 222和200不在$ sort_order_id数组中,因此它按照之前的顺序排在最后)

我尝试了很多,但无法为此创建算法...我希望有人会帮助我......

Jon*_*Jon 5

采用标准代码对数组进行排序id:

usort($data, function($x, $y) { return $x['id'] - $y['id']; });
Run Code Online (Sandbox Code Playgroud)

你想要做的不是通过id本身排序,而是通过每个id的"权重"(它代表你想要放入id的任意顺序)来排序.因此,创建一个数组,其中键是id,值是权重,并使用它将id转换为权重:

// array_flip turns 0 => 112, 1 => 111, ... into 122 => 0, 111 => 1, ...
$weights = array_flip(array('112','111','132','100'));

usort($data, function($x, $y) use($weights) {
    return $weights[$x['id']] - $weights[$y['id']];
});
Run Code Online (Sandbox Code Playgroud)

更新:由于您还想处理没有指定权重的ID,您将不得不进一步扩展上述内容:

usort($data, function($x, $y) use($weights) {
    if (!isset($weights[$x['id']], $weights[$y['id']])) {
        // none of the ids have weight, so sort by bare id
        return $x['id'] - $y['id'];
    }
    else if (!isset($weights[$x['id']])) { 
        // x does not have weight, put it last
        return 1;
    }
    else if (!isset($weights[$y['id']])) {
        // y does not have weight, put it last
        return -1;
    }

    // both have weights, use them
    return $weights[$x['id']] - $weights[$y['id']];
});
Run Code Online (Sandbox Code Playgroud)