Удалить дубликаты из многомерного массива на основе более высоких точек - PullRequest
1 голос
/ 01 ноября 2009

Я ломаю голову, пытаясь придумать решение. Я могу найти множество решений для удаления дубликатов из двумерного массива, но мне нужно удалить дубликаты, если значение меньше другого. Вот массив:

Array
(
    [basketball] => Array
        (
            [0] => stdClass Object
                (
                    [id] => 2
                    [username] => Beans
                    [points] => 30
                )

            [1] => stdClass Object
                (
                    [id] => 314
                    [username] => slights
                    [points] => 20
                )

            [2] => stdClass Object
                (
                    [id] => 123
                    [username] => gibb54
                    [points] => 5
                )

        )

    [soccer] => Array
        (
            [0] => stdClass Object
                (
                    [id] => 2
                    [username] => Beans
                    [points] => 95
                )

            [1] => stdClass Object
                (
                    [id] => 49
                    [username] => sans
                    [points] => 65
                )

            [2] => stdClass Object
                (
                    [id] => 122
                    [username] => peano
                    [points] => 50
                )

            [3] => stdClass Object
                (
                    [id] => 174
                    [username] => fordb
                    [points] => 30
                )

            [4] => stdClass Object
                (
                    [id] => 112
                    [username] => danc
                    [points] => 30
                )


        )

)

Как видите, идентификатор пользователя 2 Beans - это первый выбор как для баскетбола, так и для футбола. Поскольку у них больше очков за футбол, мне нужно удалить их запись для баскетбола, чтобы сделать ID 314, пренебрегая значением 0.

Мне нужно будет делать это непрерывно, пока ни один пользователь не получит значение 0 для любого из значений первичного массива дважды.

Я пробовал разные комбинации решений foreach, но никуда не денусь. Я думал, что цикл while будет более подходящим, но я не знаю, какое условие проверять.

Есть идеи, пожалуйста?!

1 Ответ

1 голос
/ 01 ноября 2009

Я бы перебрал ваши данные и создал бы словарь, где ключи - это идентификаторы пользователя, а значения - соответствующие объекты пользователя с добавленным видом спорта. Затем вы можете восстановить свою примерную структуру массива данных, пройдя по этому дедуплицированному массиву, используя спортивные данные, чтобы определить, куда поместить каждого пользователя.

Чтобы создать дедуплицированный массив, используйте что-то вроде:

$deDupedData = array();
foreach ($data as $sport => $users) {
    foreach ($users as $user) {
        if (isset($deDupedData[$user->id])) {
            if ($user->points > $deDupedData[$user->id]->points) {
                $deDupedData[$user->id]->sport = $sport;
                $deDupedData[$user->id]->points = $user->points;
            } 
        } else {
            $modifiedUser = $user;
            $modifiedUser->sport = $sport;
            $deDupedData[$user->id] = $modifiedUser;
        }
    }
}  
// Now reconstruct your array...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...