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

时间:2017-11-08 11:28:18

标签: php

我有两个数组一个数组是从数据库中获取的,第二个是用户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
)

上面的函数我只返回匹配的用户并重新从db数组中删除用户。 帮助解决这个问题。

2 个答案:

答案 0 :(得分:1)

问题是$keyfalse中没有的所有ID都是相同的($inputs),所以你多次覆盖$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;
}

答案 1 :(得分:0)

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

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

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