4 回答

TA贡献1772条经验 获得超8个赞
如果您只想将所有 s 移到末尾,则实际上不需要与 进行比较,甚至不需要返回零或 -1。比较表达式真正需要的唯一逻辑是“如果$a应该排在最后,请将其向下移动。shouldgolast
$a
$b
usort($array, fn($a) => $a['shouldgolast'] === 'Y');

TA贡献1810条经验 获得超4个赞
usort 函数作为第二个参数接收一个应用作比较器的可调用参数。比较器通常以这种方式工作:
返回 1 ->第一个元素大于第二个元素
返回 -1 ->第 2 个元素大于第一个元素
返回 0 ->两个元素相同
您必须以这种方式校正比较器功能
function sortF($a, $b)
{
if($a['shouldgolast'] == "Y"){
return 1;
}else if($b['shouldgolast'] == "Y"){
return -1;
}
return 0;
}

TA贡献1884条经验 获得超4个赞
问题是你有返回的语句,我认为逻辑不适合这种情况,它应该根据可以应用于你的情况的条件返回适当的值,你的代码应该看起来像这样:else if1
<?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;
}
?>

TA贡献1815条经验 获得超13个赞
您无需对值进行排序。
方法#1:
您只需使用指针即可将所有数组移动到右侧。这类似于荷兰国旗算法,我们将项目分组在一起。shouldgolastY
片段:
$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_ptrYNYN
方法#2:
如果你想要一个稳定的分组,意味着保持所有元素和元素的顺序,你可以简单地将它们收集在2个不同的数组中,并做一个array_merge。NY
片段:
$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
- 4 回答
- 0 关注
- 131 浏览
添加回答
举报