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 :: Убрать дубликаты из многомерного массива.

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Описание: Убрать дубликаты из многомерного массива.
Sound
Отправлено: 19 Февраля, 2018 - 11:21:06
Post Id



Новичок


Покинул форум
Сообщений всего: 27
Дата рег-ции: Сент. 2012  


Помог: 0 раз(а)




Добрый день форумчани, есть необходимость убрать из многомерного массива дубли, работа с циклами не подходит по причине большого количества записей 100 000+. Пробовал через циклы виснет сервер. Вот пример массива:

PHP:
скопировать код в буфер обмена
  1.  
  2. $arrey_test = array(
  3. "0" <=  array ("0" <= "addres1", "1" <= "name", "2" <= "famely", "3" <= "pol"),
  4. "1" <=  array ("0" <= "addres2", "1" <= "name", "2" <= "famely", "3" <= "pol"),
  5. "2" <=  array ("0" <= "addres1", "1" <= "name", "2" <= "famely", "3" <= "pol"),
  6. "3" <=  array ("0" <= "addres3", "1" <= "name", "2" <= "famely", "3" <= "pol"),
  7. "4" <=  array ("0" <= "addres4", "1" <= "name", "2" <= "famely", "3" <= "pol"),
  8. "5" <=  array ("0" <= "addres2", "1" <= "name", "2" <= "famely", "3" <= "pol"),
  9. );
  10.  
  11.  


Таких строк от 100 000 простым циклом их тяжело перебрать, помогите решить вопрос.
Дубликаты нужно убрать только в одном поле (addres) ну и соответственно удалить массив который является дублем, все остальные поля не важны!

За ранее спасибо!

(Отредактировано автором: 19 Февраля, 2018 - 11:23:22)

 
 Top
andrewkard
Отправлено: 19 Февраля, 2018 - 11:49:40
Post Id


Участник


Покинул форум
Сообщений всего: 1372
Дата рег-ции: Нояб. 2014  


Помог: 30 раз(а)




А откуда данные? Из БД?
 
 Top
Sound
Отправлено: 19 Февраля, 2018 - 11:57:20
Post Id



Новичок


Покинул форум
Сообщений всего: 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)

 
 Top
Строитель
Отправлено: 19 Февраля, 2018 - 12:06:59
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




Sound
Спойлер (Отобразить)
 
 Top
Sound
Отправлено: 19 Февраля, 2018 - 12:30:31
Post Id



Новичок


Покинул форум
Сообщений всего: 27
Дата рег-ции: Сент. 2012  


Помог: 0 раз(а)




Строитель пишет:
Sound
Спойлер (Отобразить)


Спасибо но это не совсем подходит, так как дубль нужно искать в поле 0 где должно быть значение (addres) все остальные поля могут быть одинаковыми, в вашем случаи будут удаляться полностью одинаковые строки из массива!

Вид массива для обработки:
PHP:
скопировать код в буфер обмена
  1.  
  2. [0] <= [0] <= [addres1]
  3.            [1] <= [name]
  4.            [2] <= [famely]
  5.            [3] <= [pol]
  6.  
  7. [1] <= [0] <= [addres2]
  8.            [1] <= [name]
  9.            [2] <= [famely]
  10.            [3] <= [pol]
  11.  
  12. [2] <= [0] <= [addres3]
  13.            [1] <= [name]
  14.            [2] <= [famely]
  15.            [3] <= [pol]
  16.  
  17. [3] <= [0] <= [addres2]
  18.            [1] <= [name]
  19.            [2] <= [famely]
  20.            [3] <= [pol]
  21.  
  22. [4] <= [0] <= [addres4]
  23.            [1] <= [name]
  24.            [2] <= [famely]
  25.            [3] <= [pol]
  26.  

(Отредактировано автором: 19 Февраля, 2018 - 12:34:18)

 
 Top
Строитель
Отправлено: 19 Февраля, 2018 - 13:37:54
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




Sound, у вас в каждом посту разные данные. Определитесь для начала со структурой исходного массива.
 
 Top
andrewkard
Отправлено: 19 Февраля, 2018 - 13:48:09
Post Id


Участник


Покинул форум
Сообщений всего: 1372
Дата рег-ции: Нояб. 2014  


Помог: 30 раз(а)




Может что то типа этого:

PHP:
скопировать код в буфер обмена
  1.  
  2. $array_test = array(
  3.     "0" =>  array ("0" => "addres1", "1" => "name", "2" => "famely", "3" => "pol"),
  4.     "1" =>  array ("0" => "addres2", "1" => "name", "2" => "famely", "3" => "pol"),
  5.     "2" =>  array ("0" => "addres1", "1" => "name", "2" => "famely", "3" => "pol"),
  6.     "3" =>  array ("0" => "addres3", "1" => "name", "2" => "famely", "3" => "pol"),
  7.     "4" =>  array ("0" => "addres4", "1" => "name", "2" => "famely", "3" => "pol"),
  8.     "5" =>  array ("0" => "addres2", "1" => "name", "2" => "famely", "3" => "pol"),
  9. );
  10.  
  11. $exist = [];
  12.  
  13. function clear($a){
  14.  
  15.     global $exist;
  16.  
  17.     if(!empty($exist[$a[0]])){
  18.         return false;
  19.     }else{
  20.         $exist[$a[0]] = 1;
  21.     }
  22.  
  23.     return true;
  24. }
  25.  
  26.  
  27. print_r(array_filter($array_test,'clear'));
  28.  
 
 Top
Sound
Отправлено: 19 Февраля, 2018 - 14:11:03
Post Id



Новичок


Покинул форум
Сообщений всего: 27
Дата рег-ции: Сент. 2012  


Помог: 0 раз(а)




andrewkard пишет:
Может что то типа этого:

PHP:
скопировать код в буфер обмена
  1.  
  2. $array_test = array(
  3.     "0" =>  array ("0" => "addres1", "1" => "name", "2" => "famely", "3" => "pol"),
  4.     "1" =>  array ("0" => "addres2", "1" => "name", "2" => "famely", "3" => "pol"),
  5.     "2" =>  array ("0" => "addres1", "1" => "name", "2" => "famely", "3" => "pol"),
  6.     "3" =>  array ("0" => "addres3", "1" => "name", "2" => "famely", "3" => "pol"),
  7.     "4" =>  array ("0" => "addres4", "1" => "name", "2" => "famely", "3" => "pol"),
  8.     "5" =>  array ("0" => "addres2", "1" => "name", "2" => "famely", "3" => "pol"),
  9. );
  10.  
  11. $exist = [];
  12.  
  13. function clear($a){
  14.  
  15.     global $exist;
  16.  
  17.     if(!empty($exist[$a[0]])){
  18.         return false;
  19.     }else{
  20.         $exist[$a[0]] = 1;
  21.     }
  22.  
  23.     return true;
  24. }
  25.  
  26.  
  27. print_r(array_filter($array_test,'clear'));
  28.  


Огромное спасибо то что нужно!!! Если не затруднит объясните логику.

(Отредактировано автором: 19 Февраля, 2018 - 14:18:29)

 
 Top
Строитель
Отправлено: 19 Февраля, 2018 - 14:24:54
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




Sound ещё вариант в коллекцию ответов:
Спойлер (Отобразить)
 
 Top
Sound
Отправлено: 19 Февраля, 2018 - 14:42:34
Post Id



Новичок


Покинул форум
Сообщений всего: 27
Дата рег-ции: Сент. 2012  


Помог: 0 раз(а)




Строитель пишет:
Sound ещё вариант в коллекцию ответов:
Спойлер (Отобразить)


Спасибо и вам, чуть допилил ваш код получилось идеально!

PHP:
скопировать код в буфер обмена
  1. $array_test = array(
  2.     "0" =>  array ("0" => "addres1", "1" => "name", "2" => "famely", "3" => "pol"),
  3.     "1" =>  array ("0" => "addres2", "1" => "name", "2" => "famely", "3" => "pol"),
  4.     "2" =>  array ("0" => "addres1", "1" => "name", "2" => "famely", "3" => "pol"),
  5.     "3" =>  array ("0" => "addres3", "1" => "name", "2" => "famely", "3" => "pol"),
  6.     "4" =>  array ("0" => "addres4", "1" => "name", "2" => "famely", "3" => "pol"),
  7.     "5" =>  array ("0" => "addres2", "1" => "name", "2" => "famely", "3" => "pol"),
  8.     "6" =>  array ("0" => "addres5", "1" => "name", "2" => "famely", "3" => "pol"),
  9.     "7" =>  array ("0" => "addres5", "1" => "name", "2" => "famely", "3" => "pol"),
  10.     "8" =>  array ("0" => "addres5", "1" => "name", "2" => "famely", "3" => "pol"),
  11.     "9" =>  array ("0" => "addres6", "1" => "name", "2" => "famely", "3" => "pol"),
  12. );
  13.  
  14. array_map(function($a) use(&$temp) {
  15.     return $temp[$a[0]] = $a;
  16. }, $array_test);
  17.  
  18. $result = array_values($temp);
  19. print_r ($result);

(Добавление)
Вот пилю свой код под нужды и что-то последнее поле всегда пустое а должно быть значение, и еще не подскажите как прикрутить сюда проверку правильности e-mail то есть строка является адресом почты или просто набором символов!
PHP:
скопировать код в буфер обмена
  1. $array_test = array(
  2.     "0" =>  array ("0" => "my_mail6@yandex.ru", "1" => "Ваня", "2" => "Головко", "3" => "муж", "4" <= "0"),
  3.     "1" =>  array ("0" => "my_mail@yandex.ru", "1" => "Саша", "2" => "Немчур", "3" => "дев", "4" <= "0"),
  4.     "2" =>  array ("0" => "my_mail11@mail.ru", "1" => "Петя", "2" => "Бинаров", "3" => "дев", "4" <= "0"),
  5.     "3" =>  array ("0" => "my_mail11@mail.ru", "1" => "Илья", "2" => "Грицько", "3" => "муж", "4" <= "0"),
  6.     "4" =>  array ("0" => "my_mail@yandex.ru", "1" => "Виктор", "2" => "Новиков", "3" => "муж", "4" <= "0"),
  7.     "5" =>  array ("0" => "my_mail5@yandex.ru", "1" => "Николай", "2" => "Василенко", "3" => "дев", "4" <= "0"),
  8.     "6" =>  array ("0" => "my_mail3@yandex.ru", "1" => "Валентин", "2" => "Цветков", "3" => "муж", "4" <= "0"),
  9.     "7" =>  array ("0" => "my_mail2@yandex.ru", "1" => "Дмитрий", "2" => "Колесниченко", "3" => "муж", "4" <= "0"),
  10.     "8" =>  array ("0" => "my_mail11@mail.ru", "1" => "Максим", "2" => "Гордиенко", "3" => "муж", "4" <= "0"),
  11.     "9" =>  array ("0" => "my_mail@yandex.ru", "1" => "Алексей", "2" => "Никифоров", "3" => "дев", "4" <= "0"),
  12. );
  13.  
  14. array_map(function($a) use(&$temp) {
  15.     return $temp[$a[0]] = $a;
  16. }, $array_test);
  17.  
  18. $result = array_values($temp);
  19. print_r ($result);

(Отредактировано автором: 19 Февраля, 2018 - 15:16:45)

 
 Top
Строитель
Отправлено: 19 Февраля, 2018 - 15:13:42
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




Sound пишет:
Спасибо и вам, чуть допилил ваш код получилось идеально!
Тогда уж лучше перезаписывать исходный массив $array_test:
Спойлер (Отобразить)
PS: В этом примере использовано сокращённое объявление массива (без array()), которое поддерживается с PHP >= 5.4
 
 Top
Sound
Отправлено: 19 Февраля, 2018 - 15:20:13
Post Id



Новичок


Покинул форум
Сообщений всего: 27
Дата рег-ции: Сент. 2012  


Помог: 0 раз(а)




Строитель пишет:
Sound пишет:
Спасибо и вам, чуть допилил ваш код получилось идеально!
Тогда уж лучше перезаписывать исходный массив $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)

 
 Top
Строитель
Отправлено: 19 Февраля, 2018 - 15:24:08
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




Sound пишет:
что-то последнее поле всегда пустое а должно быть значение.
Там не правильно записан оператор <= . Нужно так: =>
 
 Top
Sound
Отправлено: 19 Февраля, 2018 - 15:31:36
Post Id



Новичок


Покинул форум
Сообщений всего: 27
Дата рег-ции: Сент. 2012  


Помог: 0 раз(а)




Строитель пишет:
Sound пишет:
что-то последнее поле всегда пустое а должно быть значение.
Там не правильно записан оператор <= . Нужно так: =>


Да не правильно. Не досмотрел. Нужно что бы получилось как-то так:

PHP:
скопировать код в буфер обмена
  1.  
  2. (
  3.     [0] => Array
  4.         (
  5.             [0] => my_mail6@yandex.ru
  6.             [1] => Ваня
  7.             [2] => Головко
  8.             [3] => муж
  9.             [4] => 0
  10.         )
  11.  
  12.     [1] => Array
  13.         (
  14.             [0] => my_mail@yandex.ru
  15.             [1] => Алексей
  16.             [2] => Никифоров
  17.             [3] => дев
  18.             [4] => 0
  19.         )
  20.  
  21.     [2] => Array
  22.         (
  23.             [0] => my_mail11@mail.ru
  24.             [1] => Максим
  25.             [2] => Гордиенко
  26.             [3] => муж
  27.             [4] => 0
  28.         )
  29.  
  30.     [3] => Array
  31.         (
  32.             [0] => my_mail5@yandex.ru
  33.             [1] => Николай
  34.             [2] => Василенко
  35.             [3] => дев
  36.             [4] => 0
  37.         )
  38.  
  39.     [4] => Array
  40.         (
  41.             [0] => my_mail3@yandex.ru
  42.             [1] => Валентин
  43.             [2] => Цветков
  44.             [3] => муж
  45.             [4] => 0
  46.         )
  47.  
  48.     [5] => Array
  49.         (
  50.             [0] => my_mail2@yandex.ru
  51.             [1] => Дмитрий
  52.             [2] => Колесниченко
  53.             [3] => муж
  54.             [4] => 0
  55.         )
  56.  
  57. )
  58.  

(Отредактировано автором: 19 Февраля, 2018 - 15:33:47)

 
 Top
Строитель
Отправлено: 19 Февраля, 2018 - 15:33:02
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




Sound пишет:
как прикрутить сюда проверку правильности e-mail
Проверяйте на наличие символа @ - это самый простой вариант. Можно регулярными выражениями, или пхпшными функциями, но надо ли? Если кто-то не захочет указать свой email, то он итак его не укажет (напишет что-то типа ert@ert.com) ... С другой стороны - если надо указать правильный email (например для восстановления пароля), то юзер сам позаботится о правильности ввода.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB