За последние 24 часа нас посетили 32794 программиста и 1820 роботов. Сейчас ищут 863 программиста ...

сравнение массивов

Тема в разделе "PHP для новичков", создана пользователем graf_vorontsov, 3 янв 2013.

  1. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    помогите пожалуйста разобраться. есть многомерный массив, хочу проверить присутствует ли значение в каком либо массиве и если найдено, то удалить второй массив(не по счёту второй, а тот в котором найдено значение).
    проблема следующая - если это 2 массива - то без проблем... а если 50 массивов, как сравнить например элемент 23 массива с элементом 32 :)
    Код (Text):
    1.     $s = array(array(1,2,3,5),array(0,2,14,8),array(10,2,18,28));
    2.    
    3.     if($s['0']['1'] == $s['1']['1']){
    4.         unset($s['1']);
    5.         echo "yes";
    6.         print_r($s);
    7.     }else{
    8.         echo "no";
    9.     }
     
  2. Solonik

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

    С нами с:
    2 дек 2012
    Сообщения:
    17
    Симпатии:
    0
    А если попробовать перебрать массивы циклом к примеру $s['i']['j']
    И перебирать i,j подставляя значения?
     
  3. Invision

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

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    Рекурсивно
     
  4. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    так чтоли...
    Код (Text):
    1.  
    2.     function recursion($arr)
    3. {
    4.     if(is_array($arr))
    5.     {
    6.         for($i=0; $i<count($arr); $i++)
    7.         {
    8.             if(is_array($arr[$i]))
    9.             {
    10.                 recursion($arr[$i]);
    11.             }
    12.             else
    13.             {
    14.                 echo $arr[$i].'<br>';
    15.             }
    16.         }
    17.     }
    18.     else
    19.     {
    20.         echo $arr.'<br>';    
    21.     }
    22. }
    23.  
    24.  
    25. // Вывод на монитор
    26. recursion($s);

    вот что-то наваял.....
    Код (Text):
    1.  
    2.     $s = array(array('first',2,3,5),array('second',2,8,15),array('tri',22,88,55),array('four',2,9,11),array('five',2,99,111));
    3.    
    4.     foreach ($s as $s_data){
    5.         $i = -1;
    6.         foreach($s_data as $s_d){
    7.            
    8.             if($s[$i]['1'] == $s[$i]['1']){
    9.                
    10.                 $i++;
    11.                 //echo "yes";
    12.                 print_r($s_data[$i]);
    13.                
    14.                 echo '<br>';
    15.             }else{
    16.                 echo "no";
    17.             }
    18.            
    19.         }
    20.        
    21.     }
    смущает конструкция
    Код (Text):
    1.  if($s[$i]['1'] == $s[$i]['1']){
     
  5. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    вот так ещё...
    Код (Text):
    1.  
    2. $s = array(array('first',2,3,5),array('second',2,8,15),array('tri',22,88,55),array('four',2,9,11),array('five',2,99,111));
    3.     for($i=0; $i < count($s); $i++){
    4.         for($q=0; $q < count($s[$i]); $q++){  
    5.             echo  " -> ".$s[$i][$q];    
    6.         }      
    7.     echo "<br>";  
    8.     }
    но как сравнить значения массивов друг с другом и удалить те массивы которых по 2, чтоб не было массивов с одинаковыми значениями
     
  6. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    люди!!! подскажите!! ну пожалуйста, я не пойму как сравнить $s[$i]['1'] == $s[$i]['1'] ------ что я не так делаю
    array_walk_recursive судя по описанию, можно применить в моём случае, но как?! не пойму.
     
  7. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    array_diff и array_intersect точно не пододят к вашей задаче?
    если проблема в многомерности, то можно применить "распрямление" массивов и затем искать пересечение.
     
  8. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Вот твой изначальный массив из примера:
    Код (PHP):
    1. $s = array(array('first',2,3,5),array('second',2,8,15),array('tri',22,88,55),array('four',2,9,11),array('five',2,99,111)); 
    А теперь напиши, каким он должен стать после обработки? А то я, например, текстовое описание задачи как-то... недопонимаю.
     
  9. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    sobachnik, а вопрос к кому?
     
  10. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    $s = array(array('first',2,3,5),array('tri',22,88,55));
    вот таким.

    т.е. хочу удалить все массивы в которых содержится элемент arr[1] одинаковый т.е. цифра "2" в моём случае. При нахождении повторяющегося значения в разных массивах - удалить массив(ну чтоб был только один массив с таким значением в конкретном индексе)
    ..ну вроде понятно рассказал
     
  11. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    не то чтобы не подходят, просто не знаю как применить в моём случае.
     
  12. Dmitriy A. Arteshuk

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

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    Граф, для начала надо поменять аватарку
     
  13. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    А сравниваем - только элементы массива с индексом 1? Ну, т.е. получается, только первую цифру каждого массива берём для сравнения, остальные нас не интересуют?
    Вопрос к ТС
     
  14. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    да

    Добавлено спустя 4 минуты 47 секунд:
    теперь норм? :))))
     
  15. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Вот такое получилось.
    Код (PHP):
    1. <?php
    2. $s = array(
    3.     array('first', 2, 3, 5),
    4.     array('second', 2, 8, 15),
    5.     array('tri', 22, 88, 55),
    6.     array('four', 2, 9, 11),
    7.     array('five', 2, 99, 111)
    8. );
    9.  
    10. foreach($s as $key1 => $data1) {
    11.     $unset = false;
    12.     foreach($s as $key2 => $data2) {
    13.         if($key2 == $key1) {
    14.             $unset = true;
    15.             continue;
    16.         }
    17.         if($unset and $data1[1] == $data2[1])
    18.             unset($s[$key2]);
    19.     }
    20. }
    21.  
    22. echo('<pre>');
    23. print_r($s);
    24. ?>
    Наверно можно подумать над оптимизацией, а может и есть какая-то готовая функция для упрощения этого. Но думать - сейчас лень :)
     
  16. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    аааа! капец!! то что надо! спасибо. Не пришла мне в голову мысль о том что сравнивать массивы надо пройти в цикле один и тот же массив 2 раза!!!
    Код (Text):
    1. foreach($s as $key1 => $data1)
    2. а потом
    3.       foreach($s as $key2 => $data2)
    спасибо огромное!!!
     
  17. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    а как на счет такой идеи:
    Код (Text):
    1. $array = array_merge($array1, $array2);
    2. $array = array_unique($array);
     
  18. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    такая идея была бы проще всего еслиб ф-ция array_unique могла удалять одинаковые массивы а не только одинаковые элементы одного массива :)
    но.. к сожалению
    и Замечание: Обратите внимание, что array_unique() не предназначена для работы с многомерными массивами. (это из мануала)