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

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

1. papagot - 21 Февраля, 2014 - 12:20:45 - перейти к сообщению
есть вот такой массив
PHP:
скопировать код в буфер обмена
  1.  
  2.     [response] => Array
  3.         (
  4.             [0] => 6
  5.             [1] => Array
  6.                 (
  7.                     [mid] => 14966
  8.                     [date] => 1392976445
  9.                     [out] => 0
  10.                     [uid] => 239099718
  11.                     [read_state] => 0
  12.                     [title] =>  ...
  13.                     [body] => ваыпывапы
  14.                                        
  15.                                 )
  16.  
  17.             [2] => Array
  18.                 (
  19.                     [mid] => 14948
  20.                     [date] => 1392976013
  21.                     [out] => 0
  22.                     [uid] => 85290242
  23.                     [read_state] => 0
  24.                     [title] =>  ...
  25.                     [body] => ваыпывапы
  26.                 )
  27.  
  28.             [3] => Array
  29.                 (
  30.                     [mid] => 14947
  31.                     [date] => 1392976012
  32.                     [out] => 0
  33.                     [uid] => 85290242
  34.                     [read_state] => 0
  35.                     [title] =>  ...
  36.                     [body] => ваыпаывпаыв
  37.                 )
  38.  
  39.             [4] => Array
  40.                 (
  41.                     [mid] => 14946
  42.                     [date] => 1392976011
  43.                     [out] => 0
  44.                     [uid] => 85290242
  45.                     [read_state] => 0
  46.                     [title] =>  ...
  47.                     [body] => паывпывпвы
  48.                 )
  49.  
  50.             [5] => Array
  51.                 (
  52.                     [mid] => 14945
  53.                     [date] => 1392976010
  54.                     [out] => 0
  55.                     [uid] => 85290242
  56.                     [read_state] => 0
  57.                     [title] =>  ...
  58.                     [body] => пваыпваыпвы
  59.                 )
  60.  
  61.             [6] => Array
  62.                 (
  63.                     [mid] => 14944
  64.                     [date] => 1392976009
  65.                     [out] => 0
  66.                     [uid] => 85290242
  67.                     [read_state] => 0
  68.                     [title] =>  ...
  69.                     [body] => авпывапывапыв
  70.                 )
  71.  
  72.         )
  73.  
  74. )
  75.  


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

PHP:
скопировать код в буфер обмена
  1.  
  2. $d = 1;
  3. while($d <= $unread_messages_get['response'][0])
  4. {
  5.         $unread_messages = $unread_messages_get['response'][$d]['uid'];
  6.         $unread_messages=array_map("unserialize", array_unique( array_map("serialize", $unread_messages) ));   
  7.         $d++;  
  8. }
  9. echo '<pre>';
  10. print_r($unread_messages);
  11. echo '__________________________';
  12. print_r($unread_messages_get);
  13. echo '</pre>';
  14.  


В конечном итоге не чего не выводит. Помогите написать....
И да
Выводит NULL

Зарание Большое спасибо.
2. Мелкий - 21 Февраля, 2014 - 12:28:03 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. $rgOutput = array();
  2. foreach ($rgInput as $item) {
  3.     $rgOutput[ $item['uid'] ] = $item;
  4.     }

И получите в результате только последние встреченные из неуникальных элементов.
3. papagot - 21 Февраля, 2014 - 12:39:32 - перейти к сообщению
Мелкий пишет:
PHP:
скопировать код в буфер обмена
  1. $rgOutput = array();
  2. foreach ($rgInput as $item) {
  3.     $rgOutput[ $item['uid'] ] = $item;
  4.     }

И получите в результате только последние встреченные из неуникальных элементов.


Написал
PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3. $d = 1;
  4. while($d <= $unread_messages_get['response'][0]){
  5.         $unread_messages = $unread_messages_get['response'][$d]['uid'];
  6.         //$unread_messages = array_map("unserialize", array_unique( array_map("serialize", $unread_messages) ));
  7.         $d++;
  8. }
  9.  
  10. $rgOutput = $unread_messages;
  11. foreach($rgInput as $item)
  12. {
  13.         $rgOutput[ $item['uid'] ] = $item;
  14. }
  15.  
  16. echo '<pre>';
  17. print_r($rgOutput);
  18. echo '__________________________';
  19. //print_r($unread_messages_get);
  20. echo '</pre>';
  21.  
  22.  
  23.  


Выводит только последнее значение.
то есть на выходе получаю
PHP:
скопировать код в буфер обмена
  1. 85290242

Извините что сразу не сказал но массив надо сохранить так как он есть....
то есть в конечном итоге я должен получить:
PHP:
скопировать код в буфер обмена
  1.  
  2.     [response] => Array
  3.         (
  4.             [0] => 6
  5.             [1] => Array
  6.                 (
  7.                     [mid] => 14966
  8.                     [date] => 1392976445
  9.                     [out] => 0
  10.                     [uid] => 239099718
  11.                     [read_state] => 0
  12.                     [title] =>  ...
  13.                     [body] => ваыпывапы
  14.                                        
  15.                                 )
  16.  
  17.             [2] => Array
  18.                 (
  19.                     [mid] => 14948
  20.                     [date] => 1392976013
  21.                     [out] => 0
  22.                     [uid] => 85290242
  23.                     [read_state] => 0
  24.                     [title] =>  ...
  25.                     [body] => ваыпывапы
  26.                 )
  27.  
  28. )
  29.  
4. Мелкий - 21 Февраля, 2014 - 12:50:44 - перейти к сообщению
papagot пишет:
$rgOutput = $unread_messages;

Странно, что вы вообще не получили пары notice за обращение к $rgInput.

Если в вашем $unread_messages только один элемент, что ваш эксперимент показал, то что там фильтровать?
5. papagot - 21 Февраля, 2014 - 13:05:29 - перейти к сообщению
Мелкий пишет:
Если в вашем $unread_messages только один элемент, что ваш эксперимент показал, то что там фильтровать?


ок перепроверил дествительно получялся один масив начил сначала....
PHP:
скопировать код в буфер обмена
  1.  
  2. $unread_messages_get = api('messages.get', 'access_token='.$token.'&filters=1&user_id=__');
  3. //тут формируется массив
  4.  
  5. $d = 1;
  6. while($d <= $unread_messages_get['response'][0])
  7. {
  8.             $rgOutput = $unread_messages_get;
  9.     foreach ($rgInput as $item) {
  10.         $rgOutput[ $item['response'][$d]['uid'] ] = $item; // не работает
  11. $rgOutput1[ $item['response']['uid'] ] = $item; // не работает
  12. $rgOutput2[ $item['uid'] ] = $item; // не работает
  13.         }
  14.                 $d++;  
  15. }
  16.  

Все 3 результат выводят массив как и был ((( Хочу заметить что по
PHP:
скопировать код в буфер обмена
  1.  
  2.        echo  $rgOutput[ $item['response']['5']['uid'] ]; // отображает 6 элемент из массива
  3.  
6. EuGen - 21 Февраля, 2014 - 15:09:33 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. $result = array_reduce($data, function(&$current, $x)
  2. {
  3.    $current[$x['uid']]=$x;
  4.    return $current;
  5. }, array());

?
7. papagot - 24 Февраля, 2014 - 17:01:50 - перейти к сообщению
EuGen пишет:
PHP:
скопировать код в буфер обмена
  1. $result = array_reduce($data, function(&$current, $x)
  2. {
  3.    $current[$x['uid']]=$x;
  4.    return $current;
  5. }, array());

?


Извиняюсь за сарказм и тупой вопрос а куда вписывать переменную с массивам что выводить и как?
8. Andrei.lalala - 26 Февраля, 2014 - 13:58:16 - перейти к сообщению
Я решил задачу так. Я учусь только, так что критике буду рад )
PHP:
скопировать код в буфер обмена
  1. function del($arr){
  2. while(count($arr)){
  3. $th = array_shift($arr);
  4. $fin[]=$th;
  5. $keys=array();
  6.  
  7.         foreach($arr as $k=>$val){
  8.                 if($th['uid']==$val['uid']){
  9.                 $keys[]=$k;
  10.                 }
  11.         }
  12.        
  13.         foreach($keys as $key){
  14.         unset($arr[$key]);
  15.         }
  16. }
  17. return $fin;
  18. }
9. EuGen - 26 Февраля, 2014 - 14:19:07 - перейти к сообщению
papagot пишет:
Извиняюсь за сарказм и тупой вопрос а куда вписывать переменную с массивам что выводить и как?

$data - исходный массив. $result - итог без дубликатов.
10. MAXUS - 26 Февраля, 2014 - 15:09:45 - перейти к сообщению
papagot пишет:
Помогите написать...


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


Где $data - переменная с вашим массивом.



(Добавление)
EuGen пишет:
$data - исходный массив. $result - итог без дубликатов.


У вас массив видоизменяется. Ключи рушатся.
11. EuGen - 26 Февраля, 2014 - 16:03:44 - перейти к сообщению
MAXUS пишет:
У вас массив видоизменяется. Ключи рушатся.

Они и должны. Ведь идёт удаление дублей. Кроме того, ничего не сказано, что ключи не должны быть не по порядку. А если это так нужно - применить array_values() к результату.
12. MAXUS - 26 Февраля, 2014 - 16:22:02 - перейти к сообщению
EuGen пишет:
MAXUS пишет:
У вас массив видоизменяется. Ключи рушатся.

Они и должны. Ведь идёт удаление дублей. Кроме того, ничего не сказано, что ключи не должны быть не по порядку. А если это так нужно - применить array_values() к результату.


На оставшихся элементах ключи видоизменяются. Становятся равны uid.

Добавление

И, потом, если в исходном массиве содержатся указатели, то они при таком подходе тоже порушатся. Если не содержатся, то замена массива не критична.
13. EuGen - 26 Февраля, 2014 - 16:31:31 - перейти к сообщению
MAXUS пишет:
На оставшихся элементах ключи видоизменяются. Становятся равны uid.

EuGen пишет:
ничего не сказано, что ключи не должны быть не по порядк

EuGen пишет:
А если это так нужно - применить array_values() к результату.
14. MAXUS - 26 Февраля, 2014 - 16:45:53 - перейти к сообщению
papagot пишет:

Извините что сразу не сказал но массив надо сохранить так как он есть....
то есть в конечном итоге я должен получить:
PHP:
скопировать код в буфер обмена
  1.  
  2.     [response] => Array
  3.         (
  4.             [0] => 6
  5.             [1] => Array
  6.                 (
  7.                     [mid] => 14966
  8.                     [date] => 1392976445
  9.                     [out] => 0
  10.                     [uid] => 239099718
  11.                     [read_state] => 0
  12.                     [title] =>  ...
  13.                     [body] => ваыпывапы
  14.                                        
  15.                                 )
  16.  
  17.             [2] => Array
  18.                 (
  19.                     [mid] => 14948
  20.                     [date] => 1392976013
  21.                     [out] => 0
  22.                     [uid] => 85290242
  23.                     [read_state] => 0
  24.                     [title] =>  ...
  25.                     [body] => ваыпывапы
  26.                 )
  27.  
  28. )
  29.  


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

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

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


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

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





(Добавление)
EuGen пишет:
Отправлено: 26 Февраля, 2014 - 16:31:31


Array
(
[] => 6
[239099718] => Array
(
[mid] => 14966
[date] => 1392976445
[out] => 0
[uid] => 239099718
[read_state] => 0
[title] => ...
[body] => ваыпывапы
)

[85290242] => Array
(
[mid] => 14944
[date] => 13929760009
[out] => 0
[uid] => 85290242
[read_state] => 0
[title] => ...
[body] => ваыпывапы
)

)

Результат выполнения вашего кода. Обратите внимание на ключи, выделенные жирным.
А помимо прочего, у нас с вами один и тот же косякУлыбка Элементы, у которых нет uid считаются дублями и остается только один из них. Я подправил этот момент.
15. EuGen - 26 Февраля, 2014 - 17:54:37 - перейти к сообщению
MAXUS пишет:
Обратите внимание на ключи, выделенные жирным.

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


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

 

Powered by ExBB FM 1.0 RC1