Используя PHP и делая запрос SELECT из БД, я получаю вывод, который мне не нравится.
Я начинаю так:
$details = Db::getInstance()->executeS($sql);
И я получаю, после
echo json_encode($details);
Для целей отладки:
[{"email":"[email protected]","lastname":"TEST","firstname":"TEST1","id_lang":"1","id_order":"1"}]
[{"email":"[email protected]","lastname":"OTHER","firstname":"DIFFERENT","id_lang":"1","id_order":"2"}]
[{"email":"[email protected]","lastname":"THIRD","firstname":"DIFFERENT","id_lang":"1","id_order":"3"}]
[{"email":"[email protected]","lastname":"THIRD","firstname":"NEW","id_lang":"1","id_order":"4"}]
Что я хочу, чтобы преобразовать массив $details
проверить в каждой «строке», имеет ли столбец электронной почты уникальные значения на всем выходе. Если да, удалите строки, содержащие дубликаты записей, и оставьте только первые, содержащие их.
Желаемый вывод:
[{"email":"[email protected]","lastname":"TEST","firstname":"TEST1","id_lang":"1","id_order":"1"}]
[{"email":"[email protected]","lastname":"THIRD","firstname":"NEW","id_lang":"1","id_order":"4"}]
(Как вы видите строки с порядком идентификаторов 2 и 3, где они удалены, так как они имеют одинаковый адрес электронной почты с первым)
Любая помощь будет высоко оценена.
Изменить: просто хотел добавить здесь, что мой код не на PHP. Вы должны изменить это.
Выполните команду электронной почты ORDER BY в операторе выбора.
Псевдокод:
Перебрать результаты:
String email1 = "";
String email2 = "";
for (i=0;i<(Detailssize); i++){
email2 = details[email][i]; //Do whatever you need to do to access the value of the email key here.
if(email2 != email1){
KEEP IT
}
else{
THROW AWAY
}
email1 = email2;
}
Очевидно, это не PHP. Прошло много времени с тех пор, как я написал PHP. Тем не менее, по логике это все равно должно работать. Я уверен, что есть способ изменить ваш оператор SELECT, чтобы он возвращал только одно из каждого значения, но я не достаточно хорош в SQL для этого. Это не очень хорошее решение, но надеюсь, что оно поможет.
Держите список писем, которые вы видели раньше; всякий раз, когда вы сталкиваетесь с электронным письмом, которое видели ранее, пропустите эту строку.
Как это:
$newSet = array();
$seenBefore = array();
foreach( $details as $row ) {
if( isset( $seenBefore[ $row['email'] ) ) {
continue; // jump to the next row
}
// this email address must be new; add it to things we've seen before then add this row to the newSet
$seenBefore[$row['email']] = true;
$newSet[] = $row;
}
Затем выведите $ newSet любым удобным вам способом.