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 :: Удаление дублей из многомерных масивов. [2]

 PHP.SU

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


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

> Без описания
papagot
Отправлено: 26 Февраля, 2014 - 18:28:22
Post Id



Гость


Покинул форум
Сообщений всего: 70
Дата рег-ции: Март 2011  
Откуда: Riga, Latvia


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




EuGen пишет:
papagot пишет:
Извиняюсь за сарказм и тупой вопрос а куда вписывать переменную с массивам что выводить и как?

$data - исходный массив. $result - итог без дубликатов.


До применения кода

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


написал
PHP:
скопировать код в буфер обмена
  1.  
  2. $data = $unread_messages_get;
  3.  
  4.     $result = array_reduce($data, function(&$current, $x)
  5.     {
  6.        $current[$x['uid']]=$x;
  7.        return $current;
  8.     }, array());
  9.        
  10.                         echo '<pre>';
  11.                         print_r ($result);
  12.                         echo '</pre>';
  13.  


на выходе получил...
Спойлер (Отобразить)

Что не так? Растолкуйте где ошибся снова ((((
 
 Top
EuGen Администратор
Отправлено: 26 Февраля, 2014 - 19:00:37
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




papagot пишет:

Что не так? Растолкуйте где ошибся снова ((((

Ну так применять нужно не ко всему массиву, а к той его части, в которой содержатся элементы, которые нужно фильтровать. В данном случае к
PHP:
скопировать код в буфер обмена
  1. $data = $unread_messages_get['response'];


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
papagot
Отправлено: 26 Февраля, 2014 - 19:25:24
Post Id



Гость


Покинул форум
Сообщений всего: 70
Дата рег-ции: Март 2011  
Откуда: Riga, Latvia


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




EuGen пишет:
papagot пишет:

Что не так? Растолкуйте где ошибся снова ((((

Ну так применять нужно не ко всему массиву, а к той его части, в которой содержатся элементы, которые нужно фильтровать. В данном случае к
PHP:
скопировать код в буфер обмена
  1. $data = $unread_messages_get['response'];


Огромное спасибо. Карму увеличил.
Только вот пару вопрос если можно то можно нет так нет
на выходе массив

Array
(
[БЫЛО НЕ ПУСТО] => 12
[ОСТАВИТЬ ПРЕЖНИЕ ИД] => Array
(
[mid] => 15780
[date] => 1393353992
[out] => 0
[uid] => 50714197
[read_state] => 0
[title] => ...
[body] => я тоже
)

[16877930] => Array
(
[mid] => 15489
[date] => 1393250976
[out] => 0
[uid] => 16877930
[read_state] => 0
[title] => ...
[body] => пошли в бутылку?)))
)

[85290242] => Array
(
[mid] => 15438
[date] => 1393200589
[out] => 0
[uid] => 85290242
[read_state] => 0
[title] => ...
[body] => бобюь
)

)

(Отредактировано автором: 26 Февраля, 2014 - 19:31:17)

 
 Top
MAXUS
Отправлено: 26 Февраля, 2014 - 19:40:42
Post Id


Посетитель


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


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




EuGen пишет:

Да сколько же можно.
EuGen пишет:
применить array_values() к результату.


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


Задача звучала так: "мне нужно что бы удались все элементы из массива с одинаковым значением uid и остался только последний элемент."

Заменить исходный массив и удалить из него элементы - это не одно и то же. Если при этом существуют указатели (&) на элементы исходного массива или в нем самом присутствуют указатели, то связи похерятся. Также, если на ключи массива где-то ссылались хардкодом, то эти ссылки тоже работать перестанут, потому что ключи в вашем случае переименуются. Если все это для задачи не критично, то ничего в этом страшного нет. Я просто хотел подчеркнуть эти нюансы.

А вот удалить элементы с одинаковыми uid и удалить элементы без uid - это, кмк, разные задачи. Тем более, когда видно, что массив не однородный.




(Добавление)
papagot пишет:
EuGen пишет:
papagot пишет:

Что не так? Растолкуйте где ошибся снова ((((

Ну так применять нужно не ко всему массиву, а к той его части, в которой содержатся элементы, которые нужно фильтровать. В данном случае к
PHP:
скопировать код в буфер обмена
  1. $data = $unread_messages_get['response'];


Огромное спасибо. Карму увеличил.
Только вот пару вопрос если можно то можно нет так нет
на выходе массив

Array
(
[БЫЛО НЕ ПУСТО] => 12
[ОСТАВИТЬ ПРЕЖНИЕ ИД] => Array
(
[mid] => 15780
[date] => 1393353992
[out] => 0
[uid] => 50714197
[read_state] => 0
[title] => ...
[body] => я тоже
)

[16877930] => Array
(
[mid] => 15489
[date] => 1393250976
[out] => 0
[uid] => 16877930
[read_state] => 0
[title] => ...
[body] => пошли в бутылку?)))
)

[85290242] => Array
(
[mid] => 15438
[date] => 1393200589
[out] => 0
[uid] => 85290242
[read_state] => 0
[title] => ...
[body] => бобюь
)

)


Мы тут яростно дискутируем на эту тему... Чем вас мой вариант не устроил? Все ваши "а можно" в нем учтены.

(Отредактировано автором: 26 Февраля, 2014 - 19:44:25)

 
 Top
papagot
Отправлено: 26 Февраля, 2014 - 19:56:10
Post Id



Гость


Покинул форум
Сообщений всего: 70
Дата рег-ции: Март 2011  
Откуда: Riga, Latvia


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




Цитата:
Мы тут яростно дискутируем на эту тему... Чем вас мой вариант не устроил? Все ваши "а можно" в нем учтены.

Я проста пока не уловил а как тогда потом скажем доставать оставшиеся uid на автомате может я конечно чего то не догоняю... Но я предстоял удалить дубли а потом по циклу
PHP:
скопировать код в буфер обмена
  1.  
  2. $d = 1;
  3. while($d <= $unread_messages_get['response'][0])
  4. {
  5.  
  6. //получаем $unread_messages_get['response'][$d]['uid']
  7.  
  8. $d++;
  9. }
  10.  


Сейчас же я пока не догоняю как мне их достать....
 
 Top
MAXUS
Отправлено: 26 Февраля, 2014 - 19:59:23
Post Id


Посетитель


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


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




papagot пишет:

Я проста пока не уловил а как тогда потом скажем доставать оставшиеся uid на автомате может я конечно чего то не догоняю... Но я предстоял удалить дубли а потом по циклу

Сейчас же я пока не догоняю как мне их достать....


Щас. Секунду...

Вот так...

Если надо удалить дубли и оставить первый встретившийся, то:

PHP:
скопировать код в буфер обмена
  1.  
  2. $data=&$unread_messages_get['response'];
  3. foreach($data as $key=>$value){
  4.         if(!$value['uid']) continue;
  5.         if(!$check[$value['uid']]) $check[$value['uid']]=true;
  6.         else unset($data[$key]);
  7. }
  8.  


Если надо удалить дубли и оставить последний встретившийся, то:

PHP:
скопировать код в буфер обмена
  1.  
  2. $data=&$unread_messages_get['response'];
  3. foreach($data as $key=>$value){
  4.         if(!$value['uid']) continue;
  5.         if($check[$value['uid']]) unset($data[$check[$value['uid']]]);
  6.         $check[$value['uid']]=$key;
  7. }
  8.  

(Отредактировано автором: 26 Февраля, 2014 - 20:15:04)

 
 Top
papagot
Отправлено: 26 Февраля, 2014 - 20:09:37
Post Id



Гость


Покинул форум
Сообщений всего: 70
Дата рег-ции: Март 2011  
Откуда: Riga, Latvia


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




MAXUS пишет:
papagot пишет:

Я проста пока не уловил а как тогда потом скажем доставать оставшиеся uid на автомате может я конечно чего то не догоняю... Но я предстоял удалить дубли а потом по циклу

Сейчас же я пока не догоняю как мне их достать....


Щас. Секунду...

Вот так...

Если надо удалить дубли и оставить первый встретившийся, то:

PHP:
скопировать код в буфер обмена
  1.  
  2. $data=&$unread_messages_get['response'];
  3. foreach($data as $key=>$value){
  4.         if(!$value['uid']) continue;
  5.         if(!$check[$value['uid']]) $check[$value['uid']]=true;
  6.         else unset($data[$key]);
  7. }
  8.  


Если надо удалить дубли и оставить последний встретившийся, то:

PHP:
скопировать код в буфер обмена
  1.  
  2. $data=&$unread_messages_get['response'];
  3. foreach($data as $key=>$value){
  4.         if(!$value['uid']) continue;
  5.         if($check[$value['uid']]) unset($data[$check[$value['uid']]]);
  6.         $check[$value['uid']]=$key;
  7. }
  8.  


Ок и какая переменная за вывод отвечает?
 
 Top
MAXUS
Отправлено: 26 Февраля, 2014 - 20:15:37
Post Id


Посетитель


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


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




papagot пишет:

Ок и какая переменная за вывод отвечает?


А доставать так:

PHP:
скопировать код в буфер обмена
  1.  
  2. foreach($unread_messages_get['response'] as $key=>$message){
  3. // Где $message - это каждый элемент с мессаджем, а "доставать" так: $message['uid'], $message['date'] и т.п.
  4. // А $key - ключ элемента массива с мессаджем
  5. }
  6.  



Вот это запусти и все поймешь...
PHP:
скопировать код в буфер обмена
  1.  
  2. foreach($unread_messages_get['response'] as $key=>$message){
  3. echo $key."<br />";
  4. echo "<pre>";
  5. print_r($message);
  6. echo "</pre>";
  7. }
  8.  

(Отредактировано автором: 26 Февраля, 2014 - 20:17:54)

 
 Top
papagot
Отправлено: 26 Февраля, 2014 - 20:23:55
Post Id



Гость


Покинул форум
Сообщений всего: 70
Дата рег-ции: Март 2011  
Откуда: Riga, Latvia


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




MAXUS пишет:
papagot пишет:

Ок и какая переменная за вывод отвечает?


А доставать так:

PHP:
скопировать код в буфер обмена
  1.  
  2. foreach($unread_messages_get['response'] as $key=>$message){
  3. // Где $message - это каждый элемент с мессаджем, а "доставать" так: $message['uid'], $message['date'] и т.п.
  4. // А $key - ключ элемента массива с мессаджем
  5. }
  6.  



Вот это запусти и все поймешь...
PHP:
скопировать код в буфер обмена
  1.  
  2. foreach($unread_messages_get['response'] as $key=>$message){
  3. echo $key."<br />";
  4. echo "<pre>";
  5. print_r($message);
  6. echo "</pre>";
  7. }
  8.  


А вы знаете ваш вариант меня полностью устраивает. Покрайне мере на данной стадии. Огромное спасибо вам.
 
 Top
MAXUS
Отправлено: 26 Февраля, 2014 - 20:26:27
Post Id


Посетитель


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


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




papagot пишет:

А вы знаете ваш вариант меня полностью устраивает. Покрайне мере на данной стадии. Огромное спасибо вам.


Да пожалуйстаУлыбка Там слева кнопкаУлыбка
 
 Top
papagot
Отправлено: 26 Февраля, 2014 - 20:28:02
Post Id



Гость


Покинул форум
Сообщений всего: 70
Дата рег-ции: Март 2011  
Откуда: Riga, Latvia


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




MAXUS пишет:
papagot пишет:

А вы знаете ваш вариант меня полностью устраивает. Покрайне мере на данной стадии. Огромное спасибо вам.


Да пожалуйстаУлыбка Там слева кнопкаУлыбка
Уже нажал )))
 
 Top
MAXUS
Отправлено: 26 Февраля, 2014 - 20:32:32
Post Id


Посетитель


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


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




papagot пишет:
MAXUS пишет:
papagot пишет:

А вы знаете ваш вариант меня полностью устраивает. Покрайне мере на данной стадии. Огромное спасибо вам.


Да пожалуйстаУлыбка Там слева кнопкаУлыбка
Уже нажал )))


Уххх. Карма растет! Ха-ха

(Отредактировано автором: 26 Февраля, 2014 - 20:33:18)

 
 Top
papagot
Отправлено: 26 Февраля, 2014 - 21:14:29
Post Id



Гость


Покинул форум
Сообщений всего: 70
Дата рег-ции: Март 2011  
Откуда: Riga, Latvia


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




MAXUS пишет:
papagot пишет:
MAXUS пишет:
papagot пишет:

А вы знаете ваш вариант меня полностью устраивает. Покрайне мере на данной стадии. Огромное спасибо вам.


Да пожалуйстаУлыбка Там слева кнопкаУлыбка
Уже нажал )))


Уххх. Карма растет! Ха-ха


Вопрос тебе на засыпку по твоему же варианту написал

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


На выходе получаю
PHP:
скопировать код в буфер обмена
  1. (
  2.     [0] =>
  3.  
  4.     [1] => 50714197
  5.  
  6.     [2] => 16877930
  7.  
  8.     [3] => 85290242
  9.  
  10.     [4] =>
  11.  
  12.     [n] =>
  13.  
  14.     [24] => 239085031
  15.  
  16.  
  17. )


Так вот вопрос как сделать так что если найден элемент то пропускал бы а не писал пустое значение в файл.
 
 Top
MAXUS
Отправлено: 26 Февраля, 2014 - 21:49:29
Post Id


Посетитель


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


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




papagot пишет:

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


PHP:
скопировать код в буфер обмена
  1.  
  2. foreach($unread_messages_get['response'] as $key=>$message){
  3. if(!$message['uid']) continue;
  4. //А дальше все то же самое... Я там особо не вникал.
  5.  
 
 Top
papagot
Отправлено: 26 Февраля, 2014 - 22:09:25
Post Id



Гость


Покинул форум
Сообщений всего: 70
Дата рег-ции: Март 2011  
Откуда: Riga, Latvia


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




MAXUS пишет:
papagot пишет:

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


PHP:
скопировать код в буфер обмена
  1.  
  2. foreach($unread_messages_get['response'] as $key=>$message){
  3. if(!$message['uid']) continue;
  4. //А дальше все то же самое... Я там особо не вникал.
  5.  


И ещё раз огромное спасибо.
 
 Top
Страниц (3): « 1 [2] 3 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Напишите за меня, пожалуйста »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB