Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用usort ABC值的PHP Arrray排序_Php_Sorting - Fatal编程技术网

使用usort ABC值的PHP Arrray排序

使用usort ABC值的PHP Arrray排序,php,sorting,Php,Sorting,请提供以下示例代码 我正在尝试排序,以使“B”在数组中排在最后 我试过很多方法。最初我是和uasort一起工作的。但是为了调试,我将其简化为usort <?php $array = json_decode('[ { "id": "222", "name": "A", "shouldgolast": "N" }, { "id": "261", "name": "B", "s

请提供以下示例代码

我正在尝试排序,以使“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是最后一个

测试链接:

还尝试返回-1而不是1(将B带到第二位置)
测试链接2:

问题是您有
否则如果
语句返回
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;
}
?>

usort函数作为第二个参数接收一个可调用函数,该函数应作为比较器使用。比较器通常以这种方式工作:

  • 返回1->第一个元素大于第二个元素
  • 返回-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应该最后一个,请向下移动它。”


您不需要对值进行排序

方法#1:

$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;
    }
}
$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));
您只需使用一个指针,将所有数组以
shouldgolast
as
Y
的形式向右移动即可。这类似于我们将项目分组在一起

片段:

$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;
    }
}
$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));
演示:

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

方法#2:

$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;
    }
}
$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));
如果您想要一个稳定的分组,这意味着保留所有
N
元素和
Y
元素的顺序,您可以简单地将它们收集到两个不同的数组中,然后进行一次排序

片段:

$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;
    }
}
$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));

演示:

您还可以交换值。不需要排序。