PHP . SU
Программирование на PHP, MySQL и другие веб-технологии
Описание: Убрать дубликаты из многомерного массива.
Поиск в теме | Версия для печати
Sound
Отправлено: 19 Февраля, 2018 - 11:21:06
Новичок
Покинул форум
Сообщений всего: 27
Дата рег-ции: Сент. 2012
Помог: 0 раз(а)
Добрый день форумчани, есть необходимость убрать из многомерного массива дубли, работа с циклами не подходит по причине большого количества записей 100 000+. Пробовал через циклы виснет сервер. Вот пример массива:
PHP:
скопировать код в буфер обмена
"0" <= array ( "0" <= "addres1" , "1" <= "name" , "2" <= "famely" , "3" <= "pol" ) , "1" <= array ( "0" <= "addres2" , "1" <= "name" , "2" <= "famely" , "3" <= "pol" ) , "2" <= array ( "0" <= "addres1" , "1" <= "name" , "2" <= "famely" , "3" <= "pol" ) , "3" <= array ( "0" <= "addres3" , "1" <= "name" , "2" <= "famely" , "3" <= "pol" ) , "4" <= array ( "0" <= "addres4" , "1" <= "name" , "2" <= "famely" , "3" <= "pol" ) , "5" <= array ( "0" <= "addres2" , "1" <= "name" , "2" <= "famely" , "3" <= "pol" ) , ) ;
Таких строк от 100 000 простым циклом их тяжело перебрать, помогите решить вопрос.
Дубликаты нужно убрать только в одном поле (addres) ну и соответственно удалить массив который является дублем, все остальные поля не важны!
За ранее спасибо!(Отредактировано автором: 19 Февраля, 2018 - 11:23:22)
Sound
Отправлено: 19 Февраля, 2018 - 11:57:20
Новичок
Покинул форум
Сообщений всего: 27
Дата рег-ции: Сент. 2012
Помог: 0 раз(а)
andrewkard пишет: А откуда данные? Из БД?
С txt файла, с него нужно достать данные проверить на дубли и сохранить все обратно, ну это уже не проблема.
Пример файла:
Цитата:
addres1:name:famely:pol
addres2:name:famely:pol
addres3:name:famely:pol
addres1:name:famely:pol
addres4:name:famely:pol
addres2:name:famely:pol
(Отредактировано автором: 19 Февраля, 2018 - 11:59:26)
Строитель
Отправлено: 19 Февраля, 2018 - 12:06:59
Участник
Покинул форум
Сообщений всего: 1581
Дата рег-ции: Февр. 2014
Откуда: Украина
Помог: 74 раз(а)
Sound Спойлер (Отобразить ) PHP:
скопировать код в буфер обмена
$arr = [
'addres1:name:famely:pol' ,
'addres2:name:famely:pol' ,
'addres3:name:famely:pol' ,
'addres1:name:famely:pol' ,
'addres4:name:famely:pol' ,
'addres2:name:famely:pol'
] ;
Sound
Отправлено: 19 Февраля, 2018 - 12:30:31
Новичок
Покинул форум
Сообщений всего: 27
Дата рег-ции: Сент. 2012
Помог: 0 раз(а)
Строитель пишет: Sound Спойлер (Отобразить ) PHP:
скопировать код в буфер обмена
$arr = [
'addres1:name:famely:pol' ,
'addres2:name:famely:pol' ,
'addres3:name:famely:pol' ,
'addres1:name:famely:pol' ,
'addres4:name:famely:pol' ,
'addres2:name:famely:pol'
] ;
Спасибо но это не совсем подходит, так как дубль нужно искать в поле 0 где должно быть значение (addres) все остальные поля могут быть одинаковыми, в вашем случаи будут удаляться полностью одинаковые строки из массива!
Вид массива для обработки:PHP:
скопировать код в буфер обмена
[ 0 ] <= [ 0 ] <= [ addres1]
[ 1 ] <= [ name]
[ 2 ] <= [ famely]
[ 3 ] <= [ pol]
[ 1 ] <= [ 0 ] <= [ addres2]
[ 1 ] <= [ name]
[ 2 ] <= [ famely]
[ 3 ] <= [ pol]
[ 2 ] <= [ 0 ] <= [ addres3]
[ 1 ] <= [ name]
[ 2 ] <= [ famely]
[ 3 ] <= [ pol]
[ 3 ] <= [ 0 ] <= [ addres2]
[ 1 ] <= [ name]
[ 2 ] <= [ famely]
[ 3 ] <= [ pol]
[ 4 ] <= [ 0 ] <= [ addres4]
[ 1 ] <= [ name]
[ 2 ] <= [ famely]
[ 3 ] <= [ pol]
(Отредактировано автором: 19 Февраля, 2018 - 12:34:18)
andrewkard
Отправлено: 19 Февраля, 2018 - 13:48:09
Участник
Покинул форум
Сообщений всего: 1372
Дата рег-ции: Нояб. 2014
Помог: 30 раз(а)
Может что то типа этого:
PHP:
скопировать код в буфер обмена
"0" => array ( "0" => "addres1" , "1" => "name" , "2" => "famely" , "3" => "pol" ) , "1" => array ( "0" => "addres2" , "1" => "name" , "2" => "famely" , "3" => "pol" ) , "2" => array ( "0" => "addres1" , "1" => "name" , "2" => "famely" , "3" => "pol" ) , "3" => array ( "0" => "addres3" , "1" => "name" , "2" => "famely" , "3" => "pol" ) , "4" => array ( "0" => "addres4" , "1" => "name" , "2" => "famely" , "3" => "pol" ) , "5" => array ( "0" => "addres2" , "1" => "name" , "2" => "famely" , "3" => "pol" ) , ) ;
$exist = [ ] ;
function clear( $a ) {
global $exist ;
if ( ! empty ( $exist [ $a [ 0
] ] ) ) { return false ;
} else {
$exist [ $a [ 0] ] = 1 ;
}
return true ;
}
Sound
Отправлено: 19 Февраля, 2018 - 14:11:03
Новичок
Покинул форум
Сообщений всего: 27
Дата рег-ции: Сент. 2012
Помог: 0 раз(а)
andrewkard пишет: Может что то типа этого:
PHP:
скопировать код в буфер обмена
"0" => array ( "0" => "addres1" , "1" => "name" , "2" => "famely" , "3" => "pol" ) , "1" => array ( "0" => "addres2" , "1" => "name" , "2" => "famely" , "3" => "pol" ) , "2" => array ( "0" => "addres1" , "1" => "name" , "2" => "famely" , "3" => "pol" ) , "3" => array ( "0" => "addres3" , "1" => "name" , "2" => "famely" , "3" => "pol" ) , "4" => array ( "0" => "addres4" , "1" => "name" , "2" => "famely" , "3" => "pol" ) , "5" => array ( "0" => "addres2" , "1" => "name" , "2" => "famely" , "3" => "pol" ) , ) ;
$exist = [ ] ;
function clear( $a ) {
global $exist ;
if ( ! empty ( $exist [ $a [ 0
] ] ) ) { return false ;
} else {
$exist [ $a [ 0] ] = 1 ;
}
return true ;
}
Огромное спасибо то что нужно!!! Если не затруднит объясните логику.(Отредактировано автором: 19 Февраля, 2018 - 14:18:29)
Строитель
Отправлено: 19 Февраля, 2018 - 14:24:54
Участник
Покинул форум
Сообщений всего: 1581
Дата рег-ции: Февр. 2014
Откуда: Украина
Помог: 74 раз(а)
Sound ещё вариант в коллекцию ответов:
Спойлер (Отобразить ) PHP:
скопировать код в буфер обмена
"0" => array ( "0" => "addres1" , "1" => "name" , "2" => "famely" , "3" => "pol" ) , "1" => array ( "0" => "addres2" , "1" => "name" , "2" => "famely" , "3" => "pol" ) , "2" => array ( "0" => "addres1" , "1" => "name" , "2" => "famely" , "3" => "pol" ) , "3" => array ( "0" => "addres3" , "1" => "name" , "2" => "famely" , "3" => "pol" ) , "4" => array ( "0" => "addres4" , "1" => "name" , "2" => "famely" , "3" => "pol" ) , "5" => array ( "0" => "addres2" , "1" => "name" , "2" => "famely" , "3" => "pol" ) , ) ;
return $temp [ $a [ 0] ] = $a ;
} , $array_test ) ;
Sound
Отправлено: 19 Февраля, 2018 - 14:42:34
Новичок
Покинул форум
Сообщений всего: 27
Дата рег-ции: Сент. 2012
Помог: 0 раз(а)
Строитель пишет: Sound ещё вариант в коллекцию ответов:
Спойлер (Отобразить ) PHP:
скопировать код в буфер обмена
"0" => array ( "0" => "addres1" , "1" => "name" , "2" => "famely" , "3" => "pol" ) , "1" => array ( "0" => "addres2" , "1" => "name" , "2" => "famely" , "3" => "pol" ) , "2" => array ( "0" => "addres1" , "1" => "name" , "2" => "famely" , "3" => "pol" ) , "3" => array ( "0" => "addres3" , "1" => "name" , "2" => "famely" , "3" => "pol" ) , "4" => array ( "0" => "addres4" , "1" => "name" , "2" => "famely" , "3" => "pol" ) , "5" => array ( "0" => "addres2" , "1" => "name" , "2" => "famely" , "3" => "pol" ) , ) ;
return $temp [ $a [ 0] ] = $a ;
} , $array_test ) ;
Спасибо и вам, чуть допилил ваш код получилось идеально!
PHP:
скопировать код в буфер обмена
"0" => array ( "0" => "addres1" , "1" => "name" , "2" => "famely" , "3" => "pol" ) , "1" => array ( "0" => "addres2" , "1" => "name" , "2" => "famely" , "3" => "pol" ) , "2" => array ( "0" => "addres1" , "1" => "name" , "2" => "famely" , "3" => "pol" ) , "3" => array ( "0" => "addres3" , "1" => "name" , "2" => "famely" , "3" => "pol" ) , "4" => array ( "0" => "addres4" , "1" => "name" , "2" => "famely" , "3" => "pol" ) , "5" => array ( "0" => "addres2" , "1" => "name" , "2" => "famely" , "3" => "pol" ) , "6" => array ( "0" => "addres5" , "1" => "name" , "2" => "famely" , "3" => "pol" ) , "7" => array ( "0" => "addres5" , "1" => "name" , "2" => "famely" , "3" => "pol" ) , "8" => array ( "0" => "addres5" , "1" => "name" , "2" => "famely" , "3" => "pol" ) , "9" => array ( "0" => "addres6" , "1" => "name" , "2" => "famely" , "3" => "pol" ) , ) ;
return $temp [ $a [ 0] ] = $a ;
} , $array_test ) ;
(Добавление)
Вот пилю свой код под нужды и что-то последнее поле всегда пустое а должно быть значение, и еще не подскажите как прикрутить сюда проверку правильности e-mail то есть строка является адресом почты или просто набором символов! PHP:
скопировать код в буфер обмена
"0" => array ( "0" => "my_mail6@yandex.ru" , "1" => "Ваня" , "2" => "Головко" , "3" => "муж" , "4" <= "0" ) , "1" => array ( "0" => "my_mail@yandex.ru" , "1" => "Саша" , "2" => "Немчур" , "3" => "дев" , "4" <= "0" ) , "2" => array ( "0" => "my_mail11@mail.ru" , "1" => "Петя" , "2" => "Бинаров" , "3" => "дев" , "4" <= "0" ) , "3" => array ( "0" => "my_mail11@mail.ru" , "1" => "Илья" , "2" => "Грицько" , "3" => "муж" , "4" <= "0" ) , "4" => array ( "0" => "my_mail@yandex.ru" , "1" => "Виктор" , "2" => "Новиков" , "3" => "муж" , "4" <= "0" ) , "5" => array ( "0" => "my_mail5@yandex.ru" , "1" => "Николай" , "2" => "Василенко" , "3" => "дев" , "4" <= "0" ) , "6" => array ( "0" => "my_mail3@yandex.ru" , "1" => "Валентин" , "2" => "Цветков" , "3" => "муж" , "4" <= "0" ) , "7" => array ( "0" => "my_mail2@yandex.ru" , "1" => "Дмитрий" , "2" => "Колесниченко" , "3" => "муж" , "4" <= "0" ) , "8" => array ( "0" => "my_mail11@mail.ru" , "1" => "Максим" , "2" => "Гордиенко" , "3" => "муж" , "4" <= "0" ) , "9" => array ( "0" => "my_mail@yandex.ru" , "1" => "Алексей" , "2" => "Никифоров" , "3" => "дев" , "4" <= "0" ) , ) ;
return $temp [ $a [ 0] ] = $a ;
} , $array_test ) ;
(Отредактировано автором: 19 Февраля, 2018 - 15:16:45)
Строитель
Отправлено: 19 Февраля, 2018 - 15:13:42
Участник
Покинул форум
Сообщений всего: 1581
Дата рег-ции: Февр. 2014
Откуда: Украина
Помог: 74 раз(а)
Sound пишет: Спасибо и вам, чуть допилил ваш код получилось идеально!
Тогда уж лучше перезаписывать исходный массив
$array_test :
Спойлер (Отобразить ) PHP:
скопировать код в буфер обмена
$array_test = [
[ "addres1" , "name" , "famely" , "pol" ] ,
[ "addres2" , "name" , "famely" , "pol" ] ,
[ "addres1" , "name" , "famely" , "pol" ] ,
[ "addres3" , "name" , "famely" , "pol" ] ,
[ "addres4" , "name" , "famely" , "pol" ] ,
[ "addres2" , "name" , "famely" , "pol" ]
] ;
array_map ( function ( $a ) use
( & $tmp ) { return $tmp [ $a [ 0
] ] = $a ; } , $array_test ) ;
PS: В этом примере использовано сокращённое объявление массива (без array() ) , которое поддерживается с PHP >= 5.4
Sound
Отправлено: 19 Февраля, 2018 - 15:20:13
Новичок
Покинул форум
Сообщений всего: 27
Дата рег-ции: Сент. 2012
Помог: 0 раз(а)
Строитель пишет: Sound пишет: Спасибо и вам, чуть допилил ваш код получилось идеально!
Тогда уж лучше перезаписывать исходный массив
$array_test :
Спойлер (Отобразить ) PHP:
скопировать код в буфер обмена
$array_test = [
[ "addres1" , "name" , "famely" , "pol" ] ,
[ "addres2" , "name" , "famely" , "pol" ] ,
[ "addres1" , "name" , "famely" , "pol" ] ,
[ "addres3" , "name" , "famely" , "pol" ] ,
[ "addres4" , "name" , "famely" , "pol" ] ,
[ "addres2" , "name" , "famely" , "pol" ]
] ;
array_map ( function ( $a ) use
( & $tmp ) { return $tmp [ $a [ 0
] ] = $a ; } , $array_test ) ;
PS: В этом примере использовано сокращённое объявление массива
(без array() ) , которое поддерживается с PHP >= 5.4
Дело в том что с файла достается массив вот такого вида:
Цитата:
[0] => [addres1:name:famely:pol]
[1] => [addres2:name:famely:pol]
[2] => [addres6:name:famely:pol]
[3] => [addres1:name:famely:pol]
[4] => [addres3:name:famely:pol]
После обработки получается как я вам писал выше, только полей 7 -8 вместо 4 как в примере.
Цитата: [0] <= [0] <= [addres1]
[1] <= [name]
[2] <= [famely]
[3] <= [pol]
[1] <= [0] <= [addres2]
[1] <= [name]
[2] <= [famely]
[3] <= [pol]
[2] <= [0] <= [addres3]
[1] <= [name]
[2] <= [famely]
[3] <= [pol]
[3] <= [0] <= [addres2]
[1] <= [name]
[2] <= [famely]
[3] <= [pol]
[4] <= [0] <= [addres4]
[1] <= [name]
[2] <= [famely]
[3] <= [pol]
(Отредактировано автором: 19 Февраля, 2018 - 15:21:24)
Строитель
Отправлено: 19 Февраля, 2018 - 15:24:08
Участник
Покинул форум
Сообщений всего: 1581
Дата рег-ции: Февр. 2014
Откуда: Украина
Помог: 74 раз(а)
Sound пишет: что-то последнее поле всегда пустое а должно быть значение.
Там не правильно записан оператор
<= . Нужно так:
=>
Sound
Отправлено: 19 Февраля, 2018 - 15:31:36
Новичок
Покинул форум
Сообщений всего: 27
Дата рег-ции: Сент. 2012
Помог: 0 раз(а)
Строитель пишет: Sound пишет: что-то последнее поле всегда пустое а должно быть значение.
Там не правильно записан оператор
<= . Нужно так:
=>
Да не правильно. Не досмотрел. Нужно что бы получилось как-то так:
PHP:
скопировать код в буфер обмена
(
(
[ 0] => my_mail6@ yandex. ru
[ 1] => Ваня
[ 2] => Головко
[ 3] => муж
[ 4] => 0
)
(
[ 0] => my_mail@ yandex. ru
[ 1] => Алексей
[ 2] => Никифоров
[ 3] => дев
[ 4] => 0
)
(
[ 1] => Максим
[ 2] => Гордиенко
[ 3] => муж
[ 4] => 0
)
(
[ 0] => my_mail5@ yandex. ru
[ 1] => Николай
[ 2] => Василенко
[ 3] => дев
[ 4] => 0
)
(
[ 0] => my_mail3@ yandex. ru
[ 1] => Валентин
[ 2] => Цветков
[ 3] => муж
[ 4] => 0
)
(
[ 0 ] => my_mail2@ yandex. ru
[ 1 ] => Дмитрий
[ 2 ] => Колесниченко
[ 3 ] => муж
[ 4 ] => 0
)
)
(Отредактировано автором: 19 Февраля, 2018 - 15:33:47)
Строитель
Отправлено: 19 Февраля, 2018 - 15:33:02
Участник
Покинул форум
Сообщений всего: 1581
Дата рег-ции: Февр. 2014
Откуда: Украина
Помог: 74 раз(а)
Sound пишет: как прикрутить сюда проверку правильности e-mail
Проверяйте на наличие символа @ - это самый простой вариант. Можно регулярными выражениями, или пхпшными функциями, но надо ли? Если кто-то не захочет указать свой email, то он итак его не укажет
(напишет что-то типа ert@ert.com) ... С другой стороны - если надо указать правильный email
(например для восстановления пароля) , то юзер сам позаботится о правильности ввода.
Поиск в теме | Версия для печати
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
Powered by ExBB FM 1.0 RC1. InvisionExBB