繁体   English   中英

使用 usort ABC 值进行 PHP 数组排序

[英]PHP Arrray sorting with usort ABC values

请帮助以下示例代码。

我正在尝试排序,使 'B' 在数组中排在最后。

我已经尝试了很多方法。 最初我正在与uasort合作。 但是为了调试,我已将其简化为 usort。

<?php
$array = json_decode('[
    {
        "id": "222",
        "name": "A",
        "shouldgolast": "N"
    },
    {
        "id": "261",
        "name": "B",
        "shouldgolast": "Y"
    },
    {
        "id": "262",
        "name": "C",
        "shouldgolast": "N"
    }
]', true);
usort($array, "sortF");
foreach ($array as $details) {
    echo $details["name"]."\n";
}
function sortF($a, $b)
{
    if($a['shouldgolast'] == "Y"){
        return 1;
    }else if($b['shouldgolast'] == "Y"){
        return 1;
    }
    return 0;
}
?>

上面的输出是

B
A
C

我希望B是最后一个。

测试链接: https : //www.tehplayground.com/DzqhjFq6lK9Zq9Ue

也尝试通过返回 -1 而不是 1(将 B 带到第二个位置)测试链接 2: https : //www.tehplayground.com/ea51PWdFfkAupEsd

usort 函数接收作为比较器的可调用对象作为第二个参数。 比较器通常以这种方式工作:

  • 返回 1 -> 第一个元素大于第二个元素
  • return -1 -> 第二个大于第一个元素
  • 返回 0 -> 两个元素相同

您必须以这种方式更正比较器功能

function sortF($a, $b)
{
    if($a['shouldgolast'] == "Y"){
        return 1;
    }else if($b['shouldgolast'] == "Y"){
        return -1;
    }
    return 0;
}

如果您只想将所有shouldgolast移到最后,您实际上不需要将$a$b进行比较,您甚至不需要返回零或 -1。 比较表达式真正需要的唯一逻辑是“如果 $a 应该放在最后,将其向下移动”。

usort($array, fn($a) => $a['shouldgolast'] === 'Y');

问题是你有else if语句返回1 ,我认为逻辑不适合这种情况,它应该根据可以应用于你的情况的条件返回适当的值,你的代码应该是这样的:

<?php
$array = json_decode('[
    {
        "shouldgolast": "222",
        "name": "A",
        "shouldgolast": "N"
    },
    {
        "id": "261",
        "name": "B",
        "shouldgolast": "Y"
    },
    {
        "id": "262",
        "name": "C",
        "shouldgolast": "N"
    }
]', true);

usort($array, "sortF");

foreach ($array as $details) {
    echo $details["name"]."\n";
}

function sortF($a, $b)
{
    if($a['shouldgolast'] == "Y"){
        return 1;
    }

    if($b['shouldgolast'] == "Y"){
        return -1;
    }

    return 0;
}
?>

不需要对进行排序

方法#1:

您可以使用指针将shouldgolastY所有数组向右移动。 这类似于Dutch national flag algorithm ,我们将项目组合在一起。

片段:

$yes_ptr = count($array) - 1;

for($i = count($array) - 1; $i >= 0; -- $i){
    if($array[$i]['shouldgolast'] == 'Y'){
        $temp = $array[$yes_ptr];
        $array[$yes_ptr--] = $array[$i];
        $array[$i] = $temp;
    }
}

演示: https : //3v4l.org/KHFQr

在上面的方法中,我们只保留一个yes_ptr指针,它指示应该插入任何新的即将到来的Y的当前位置。 请注意,这将首先成功地将所有N分组,然后再将所有Y分组。 但是,这可能会更改值为N的元素的内部顺序。

方法#2:

如果您想要一个稳定的分组,这意味着保留所有N元素和Y元素的顺序,您可以简单地将它们收集在 2 个不同的数组中并执行array_merge

片段:

$no_array = [];
$yes_array = [];

foreach($array as $value){
    if($value['shouldgolast'] == 'N'){
        $no_array[] = $value;
    }else{
        $yes_array[] = $value;
    }
}

print_r(array_merge($no_array,$yes_array));

演示: https : //3v4l.org/Se1qd

暂无
暂无

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

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