Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Как удалять из много мерного массива элменты по условию
Покинул форум
Сообщений всего: 14
Дата рег-ции: Июль 2016 Откуда: г. Сумы, Украина
Помог: 0 раз(а)
Есть таблица в mysql.
Она имеет если упрощенно такой вид:
-------------------
| callid | status |
-------------------
| 1 | an |
-------------------
| 1 | an |
-------------------
| 1 | no an |
-------------------
| 2 | an |
-------------------
| 2 | no an |
-------------------
| 3 | no an |
-------------------
Я получаю из него 1000 записей. Как исключить из результата все записи со имеющее в status "no an" если была хоть одна запись с таким же callid но со status "an"
Я решил приблизительно так: Но чувствую решил я или неправильно или не оптимально или и то и другое
SELECT/**/FROM tablename c WHERE disposition !='NO ANSWER'ORNOTEXISTS(SELECT 1 FROM tablename ans WHERE ans.disposition ='ANSWERED'AND ans.callid = c.callid);
Покинул форум
Сообщений всего: 14
Дата рег-ции: Июль 2016 Откуда: г. Сумы, Украина
Помог: 0 раз(а)
Забыл акцентировать внимание на том, что те записи для у которых есть "NO ANSWER" и нет записи с таким же callid со статусом АNSWERED должны выводиться?
bkmz1984
Отправлено: 15 Июля, 2016 - 16:27:05
Новичок
Покинул форум
Сообщений всего: 14
Дата рег-ции: Июль 2016 Откуда: г. Сумы, Украина
Помог: 0 раз(а)
Код ОЧЕНЬ интересный но можно его разжевать комментариями? Где что делается? (Добавление)
Я не понял эту конструкцию:
return!($row['disposition']=='NO ANSWER' and isset($ans[$row['callid']]));
}));
Мелкий
Отправлено: 15 Июля, 2016 - 16:36:46
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
bkmz1984 пишет:
что те записи для у которых есть "NO ANSWER" и нет записи с таким же callid со статусом АNSWERED должны выводиться
Нет, не забыли. Это учтено, потому и так сложно относительно тупого и быстрого фильтра disposition != 'NO ANSWER'
Смысл кода - строим индекс, включающий callid всех ANSWERED. callid в ключе массива для быстрого поиска. Значение массива нас при этом, в общем-то, не интересует никак. Я присвоил true, можно присвоить что угодно другое, кроме NULL - с null проверка через isset работать корректно не будет.
Затем отфильтровываем через штатный array_filter и замыкание все записи, у которых 'disposition' == 'NO ANSWER' и которые есть индексе, построенном ранее. Без потери смысла array_filter с замыканием можно заменить примерно таким foreach:
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.