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
Форумы портала PHP.SU :: Версия для печати :: Удаление дублей из многомерных масивов. [2]
Форумы портала PHP.SU » PHP » Напишите за меня, пожалуйста » Удаление дублей из многомерных масивов.

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

16. papagot - 26 Февраля, 2014 - 18:28:22 - перейти к сообщению
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.  


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

Что не так? Растолкуйте где ошибся снова ((((
17. EuGen - 26 Февраля, 2014 - 19:00:37 - перейти к сообщению
papagot пишет:

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

Ну так применять нужно не ко всему массиву, а к той его части, в которой содержатся элементы, которые нужно фильтровать. В данном случае к
PHP:
скопировать код в буфер обмена
  1. $data = $unread_messages_get['response'];
18. papagot - 26 Февраля, 2014 - 19:25:24 - перейти к сообщению
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] => бобюь
)

)
19. MAXUS - 26 Февраля, 2014 - 19:40:42 - перейти к сообщению
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] => бобюь
)

)


Мы тут яростно дискутируем на эту тему... Чем вас мой вариант не устроил? Все ваши "а можно" в нем учтены.
20. papagot - 26 Февраля, 2014 - 19:56:10 - перейти к сообщению
Цитата:
Мы тут яростно дискутируем на эту тему... Чем вас мой вариант не устроил? Все ваши "а можно" в нем учтены.

Я проста пока не уловил а как тогда потом скажем доставать оставшиеся 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.  


Сейчас же я пока не догоняю как мне их достать....
21. MAXUS - 26 Февраля, 2014 - 19:59:23 - перейти к сообщению
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.  
22. papagot - 26 Февраля, 2014 - 20:09:37 - перейти к сообщению
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.  


Ок и какая переменная за вывод отвечает?
23. MAXUS - 26 Февраля, 2014 - 20:15:37 - перейти к сообщению
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.  
24. papagot - 26 Февраля, 2014 - 20:23:55 - перейти к сообщению
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.  


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

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


Да пожалуйстаУлыбка Там слева кнопкаУлыбка
26. papagot - 26 Февраля, 2014 - 20:28:02 - перейти к сообщению
MAXUS пишет:
papagot пишет:

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


Да пожалуйстаУлыбка Там слева кнопкаУлыбка
Уже нажал )))
27. MAXUS - 26 Февраля, 2014 - 20:32:32 - перейти к сообщению
papagot пишет:
MAXUS пишет:
papagot пишет:

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


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


Уххх. Карма растет! Ха-ха
28. papagot - 26 Февраля, 2014 - 21:14:29 - перейти к сообщению
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. )


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

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


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

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


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


И ещё раз огромное спасибо.

 

Powered by ExBB FM 1.0 RC1