繁体   English   中英

如何使用uasort自定义排序php数组

[英]How to custom sort php array with uasort

我有一个问题:

这个数组:

$aShips = array('0_204' => 1, '0_205' => 2, '0_206' => 3, '0_207' => 4);

必须是:

array(4) { ["'0_206'"]=> int(3) ["'0_205'"]=> int(2) ["'0_204'"]=> int(1) ["'0_207'"]=> int(4) }


//order like this (can be different)
$order = array("0_206", "0_205", "0_204", "0_207");

//this sort it not like my custom order
function cmp($a, $b){
    if ($a==$b) return 0;
    return ($a<$b)?-1:1;
    }

uasort($aShips, "cmp");

我查看了 w3school,但没有针对我的问题的示例。

您不需要利用排序算法。

只需翻转$order以使用其值作为键(保持它们的顺序),然​​后合并两个数组,用$aShip的值替换$order不需要的值。

当然,这假设$aShip包括$order表示的所有键值。 如果不是,则array_intersect_key()可用于过滤$order ,但这是针对未包含在已发布问题中的边缘案例。

代码:(演示

var_export(array_replace(array_flip($order), $aShips));

输出:

array (
  '0_206' => 3,
  '0_205' => 2,
  '0_204' => 1,
  '0_207' => 4,
)

当您没有在$order列出每个出现的键时,这也有效——未列出的键被“移到后面”。 由这个Demo证明。


使用自定义排序算法可以完成,将有多种方式,但我将只展示一个比较的缘故。

反转您的 order 数组并将其用作查找数组,同时要求uksort()以降序方式排序。 如果在查找中找不到遇到的键,则为其分配值 -1 以确保它移动到数组的后面。

代码:(演示

$lookup = array_flip(array_reverse($order));

uksort($aShips, function($a, $b) use ($lookup) {
    return ($lookup[$b] ?? -1) <=> ($lookup[$a] ?? -1);
});

var_export($aShips);

如果你不喜欢颠倒查找和排序 DESC,你可以在翻转之前提取$order的最高索引并递增它。 然后,这个新的“最高数字”将通过use()传递到自定义函数作用域中,然后在我写的-1 ,然后将应用 ASC 比较( a在左侧, b在右侧)。

如果这篇文章被否决,我为这个社区的状况向研究人员道歉。 我的正确、解释、演示、有见地的答案几个月来一直被低估,我对此无能为力。 相信演示链接作为证据,不要被否定票数所偏见。

根据Official PHP Docs ,您可以像这样使用uasort() (仅用于演示):

<?php
// Comparison function
function cmp($a, $b) {
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}

// Array to be sorted
$array = array('a' => 4, 'b' => 8, 'c' => -1, 'd' => -9, 'e' => 2, 'f' => 5, 'g' => 3, 'h' => -4);
print_r($array);

// Sort and print the resulting array
uasort($array, 'cmp');
print_r($array);
?>

希望这有帮助!

如果要按键排序。 使用 uksort。 试试下面的代码。

<?php

$aShips = array('0_204' => 1, '0_205' => 2, '0_206' => 3, '0_207' => 4);

uksort($aShips, function($a, $b) {
    return $b > $a;
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM