За последние 24 часа нас посетили 16566 программистов и 1681 робот. Сейчас ищут 966 программистов ...

Выбрать уникальные элементы в многомерном массиве

Тема в разделе "PHP для новичков", создана пользователем inline, 21 фев 2012.

  1. inline

    inline Активный пользователь

    С нами с:
    21 май 2010
    Сообщения:
    466
    Симпатии:
    0
    Как выбрать уникальные элементы в многомерном массиве, если эти элементы массивы?
    Например
    array
    (
    [0]=>array(1,2,3)
    [1]=>array(1,2,3)
    [2]=>array(4,5,6)
    )

    Результат array(1,2,3), array(4,5,6)
     
  2. yuri

    yuri Активный пользователь

    С нами с:
    16 янв 2012
    Сообщения:
    288
    Симпатии:
    2
  3. html-программист

    html-программист Активный пользователь

    С нами с:
    10 фев 2012
    Сообщения:
    831
    Симпатии:
    4
    Адрес:
    Kiev
    Из примера не совсем понятно, что проверяться будет.

    array
    (
    [0]=>array(1,2,3)
    [1]=>array(1,2,3)
    [2]=>array(4,5,6)
    [3]=>array(3,2,1)
    [4]=>array(1,2,4)
    [5]=>array(1,2,3,8)
    [6]=>array(1,2)
    )
    какой результат?
     
  4. inline

    inline Активный пользователь

    С нами с:
    21 май 2010
    Сообщения:
    466
    Симпатии:
    0
    (1,2,3)
    (4,5,6)
    (1,2,4)
    (1,2,3,8)
    (1,2)

    уникальность элементов вложенных массивов
     
  5. html-программист

    html-программист Активный пользователь

    С нами с:
    10 фев 2012
    Сообщения:
    831
    Симпатии:
    4
    Адрес:
    Kiev
    Код (Text):
    1. <?php
    2. $a[0]=array(1,2,3);
    3. $a[1]=array(1,2,3);
    4. $a[2]=array(4,5,6);
    5. $a[3]=array(3,2,1);
    6. $a[4]=array(1,2,4);
    7. $a[5]=array(1,2,3,8);
    8. $a[6]=array(1,2);
    9. $a[7]=array(1,2);
    10. $a[8]=array(1,2);
    11. $a[9]=array(1,2,8);
    12. $a[10]=array(1,2,2);
    13. $a[11]=array(1,2,3);
    14.  
    15. $c=count($a);
    16. $b[0]=true;
    17. for($i=0;$i<$c;$i++)
    18.     if($b[$i])
    19.         for($j=$i+1;$j<$c;$j++)
    20.             if($a[$i]!=$a[$j])
    21.                 $b[$j]=true;
    22.             else
    23.                 $a[$j]=null;
    24.        
    25. echo "<pre>";
    26. for($i=0;$i<$c;$i++)
    27.    if($b[$i])
    28.       print_r($a[$i]);
    29. echo "</pre>";
    30. ?>
    Добавлено спустя 5 минут 50 секунд:
    Или даже так:

    Код (Text):
    1. <?php
    2. $a[0]=array(1,2,3);
    3. $a[1]=array(1,2,3);
    4. $a[2]=array(4,5,6);
    5. $a[3]=array(3,2,1);
    6. $a[4]=array(1,2,4);
    7. $a[5]=array(1,2,3,8);
    8. $a[6]=array(1,2);
    9. $a[7]=array(1,2);
    10. $a[8]=array(1,2);
    11. $a[9]=array(1,2,8);
    12. $a[10]=array(1,2,2);
    13. $a[11]=array(1,2,3);
    14.  
    15. $c=count($a);
    16. for($i=0;$i<$c;$i++)
    17.     for($j=$i+1;$j<$c;$j++)
    18.         if($a[$i]==$a[$j])
    19.             $a[$j]=null;
    20. echo "<pre>";
    21. print_r($a);
    22. echo "</pre>";
    23. ?>
    Добавлено спустя 12 минут 20 секунд:
    А для того, чтобы совсем какать бабочками, можно сделать даже так:

    Код (Text):
    1. <?php
    2. $a[0]=array(1,2,3);
    3. $a[1]=array(1,2,3);
    4. $a[2]=array(4,5,6);
    5. $a[3]=array(3,2,1);
    6. $a[4]=array(1,2,4);
    7. $a[5]=array(1,2,3,8);
    8. $a[6]=array(1,2);
    9. $a[7]=array(1,2);
    10. $a[8]=array(1,2);
    11. $a[9]=array(1,2,8);
    12. $a[10]=array(1,2,2);
    13. $a[11]=array(1,2,3);
    14.  
    15. $c=count($a);
    16. $i=0;
    17. metka1:
    18.     $j=$i+1;
    19.     metka2:
    20.         if($a[$i]==$a[$j])
    21.             $a[$j]=null;
    22.         $j++;
    23.         if($j<$c)
    24.             goto metka2;
    25.     $i++;
    26.     if($i<$c)
    27.         goto metka1;
    28. echo "<pre>";
    29. print_r($a);
    30. echo "</pre>";
    31. ?>
    Добавлено спустя 9 минут 47 секунд:
    Уникальность по разным критериям можно определять. Количество элементов, порядок элементов, совпадение каких-то отдельных элементов. Из первого примера не понятно, считать ли уникальными array(1,2,3) и array(1,2,5) - поскольку во втором встречаются не уникальные элементы "1" и "2"
     
  6. yuri

    yuri Активный пользователь

    С нами с:
    16 янв 2012
    Сообщения:
    288
    Симпатии:
    2
    Не понимаю, в чем проблема ?
    У вас есть фура яшиков с фруктами, как вытащить оттуда уникальные?
    1. Создать ящик для уникальных фруктов
    2. Открыть каждый ящик с фруктаими, взять каждый фрукт из ящика, и если его нет в "уникальном" ящик - положить его туда.

    in_array вам в помощь

    Домашнее задание:
    1. как вытащить уникальные значения из одномерного массива?
    2. для чего нам нужен п.1 ?

    :)
     
  7. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    Юра...ты не в таможне работаешь?)))
     
  8. html-программист

    html-программист Активный пользователь

    С нами с:
    10 фев 2012
    Сообщения:
    831
    Симпатии:
    4
    Адрес:
    Kiev
    Но тут, как я понял, такая фигня не работает:

    Код (Text):
    1. $c=count($a);
    2. $i=0;
    3. metka1:
    4.    $j=$i+1;
    5.    metka2:
    6.       if($a[$i]==$a[$j])
    7.          $a[$j]=null;
    8.       $j++;
    9.       if($j<$c)
    10.          goto metka2;
    11.    $i++;
    12.    if($i<$c)
    13.       goto metka1;
    Потому что имеет значение, в каком порядке лежат фрукты в ящике.
     
  9. inline

    inline Активный пользователь

    С нами с:
    21 май 2010
    Сообщения:
    466
    Симпатии:
    0
    Вариантов проще, кроме как тупо сравнение элементов каждого массива со всеми элементами других массивов нет?
     
  10. fresh-max

    fresh-max Активный пользователь

    С нами с:
    11 окт 2006
    Сообщения:
    25
    Симпатии:
    0
    Адрес:
    Россия/Москва
    я полагаю, вам нужна array_unique, только она для одномерных массивов, но к официальной документации, в комментариях, есть пример для многомерных.
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    если последовательность элементов в массиве всегда одинаковая, то можно сделать финт ушами через имплод/эксплод =)
     
  12. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    да блин.
    Код (Text):
    1. $unique = array();
    2. function recursive($array) {
    3.      global $unique;
    4.      ....
    5.                if (!in_array($val, $unique)) {
    6.                     array_push($unique, $val);
     
  13. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а если последовательность не одинаковая, прокатит in_array? =) интересно... пробовать лень
     
  14. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Нет. Равными считаются только во всем одинаковые массивы. Поэтому перед проверкой надо делать sort.
     
  15. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    vs гений, йопта.
    игор - говно =(
    теперь игор грустный
     
  16. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    игор не программер