根据给定的用户ID对数组进行排序,但不从数组中删除原始数据



我有两个数组,一个是从数据库中提取的数组,第二个是用户id的数组。我希望根据第二个给定数组对提取的用户数组进行排序。我希望那些在数组顶部的用户存在于中的第二个数组中,而那些不存在于第二个输入数组中的用户也将出现在php 中排序的用户之后

$sortArr = array(14,25);
$dbArr = array(7,5,100,25,110,78,14);
sort_tag_able_users($sortArr,$dbArr);
function sort_tag_able_users($inputs, $db_inputs) {
foreach ($db_inputs as $url_response) {
$key = array_search($url_response, $inputs);
$result[$key] = $url_response;
}
ksort($result);
return $result;
}
echo "Returned Reusult";
Array
(
[0] => 14
[1] => 25
)
echo "Required Reusult";
Array
(
[0] => 14
[1] => 25
[2] => 7
[3] => 5
[4] => 100
[5] => 110
[6] => 78
)

上面的函数,我有它只返回匹配的用户和从数据库数组中删除的重映射用户。帮助解决此问题。

问题是,对于$inputs中不存在的所有ID,$key将是相同的(false),因此您要多次覆盖$result[false],结果只剩下最后一个值。

改为使用usort比较回调:

public static function sort_tag_able_users($inputs, $db_inputs) {
usort($db_inputs, function ($a, $b) use ($inputs) {
$a = array_search($a->id, $inputs);
$b = array_search($b->id, $inputs);
if ($a === $b) {
return 0;
} else if ($a === false) {
return 1;
} else if ($b === false) {
return -1;
} else {
return $a - $b;
}
});
return $db_inputs;
}

您可以将代码更改为以下内容:

public static function sort_tag_able_users($inputs, $db_inputs) {
foreach ($db_inputs as $url_response) {
// assume that the user was not found
$found = 0;
$key = array_search($url_response->id, $inputs);
if ($key != false) {
// user was found
$found = 1;
}
// group the users in two sub-arrays
$users[$found][$url_response->id] = $url_response;
}
// append users that were not found after the users that were found
$result = $users[1] + $users[0];
return $result;
}

这样,所有用户都会按照您要查找的顺序保存。

最新更新