Многомерный массив PHP находит дубликаты в определенных измерениях - PullRequest
2 голосов
/ 20 июля 2011

У меня есть следующий массив:

$masterlist=[$companies][$fieldsofcompany][0][$number]

Третье измерение существует, только если поле выбрано из $fieldsofcompany = позиция 2, которая содержит массив чисел.Другие позиции содержат обычные переменные.3-е измерение всегда 0 (массив чисел) или ноль.Позиция 4 содержит числа.

Я хочу просмотреть все компании и удалить из $masterlist все компании, которые содержат повторяющиеся номера.

Моя текущая реализация - это код:

for($i=0;$i<count($masterlist);$i++)
    {   
        if($masterlist[$i][2][0][0] != null)

        $id = $masterlist[$i][0];

        for($j=0;$j<count($masterlist[$i][2][0]);$j++)
        {
            $number = $masterlist[$i][2][0][$j];

            $query = "INSERT INTO numbers VALUES('$id','$number')";
            mysql_query($query);
        }
    }

Который вставляет номера и связанные идентификаторы в таблицу.Затем я выбираю уникальные числа, например, так:

SELECT ID,number
FROM numbers
GROUP BY number
HAVING (COUNT(number)=1)

Это кажется мне невероятно мертвым.Мой вопрос, каков наилучший способ сделать это?Я не ищу код как таковой, но подходит к проблеме.Для тех из вас, кто прочитал это далеко, спасибо.

Ответы [ 2 ]

2 голосов
/ 20 июля 2011

Для начала вам следует удалить данные, прежде чем помещать их в базу данных.

Вести справочную таблицу, в которой отслеживается «число».

Если число отсутствует в справочной таблице, используйте его и пометьте, в противном случае, если его в справочной таблице, вы можете его проигнорировать.

Используя массив для таблицы поиска и с ключами, являющимися «числом», вы можете использовать функцию isset для проверки, появилось ли число раньше или нет.

Пример псевдокода:

if(!isset($lookupTable[$number])){
    $lookupTable[$number]=1;
    //...Insert into database...
}
1 голос
/ 20 июля 2011

Теперь, когда я думаю, что понимаю, чего вы действительно хотите, вы можете придерживаться своего двухпроходного подхода, но пропустите обход MySQL.

В первом проходе соберите числа и дублируйте компании:

$duplicate_companies = array();
$number_map = array();

foreach ($masterlist as $index => $company)
{
    if ($company[2][0][0] === null)
        continue;

    foreach ($company[2][0] as $number)
    {
        if (!isset($number_map[$number])
        {
            // We have not seen this number before, associate it
            // with the first company index.
            $number_map[$number] = $index;
        }
        else
        {
            // Both the current company and the one with the index stored
            // in $number_map[$number] are duplicates.
            $duplicate_companies[] = $index;
            $duplicate_companies[] = $number_map[$number];
        }
    }
}

Во втором проходе удалите найденные нами дубликаты из основного списка:

foreach (array_unique($duplicate_companies) as $index)
{
    unset($masterlist[$index]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...