За последние 24 часа нас посетили 11797 программистов и 981 робот. Сейчас ищет 91 программист ...

Поиск одинаковых элементов в массиве?

Тема в разделе "PHP для новичков", создана пользователем Leva123, 8 окт 2021.

Метки:
  1. Leva123

    Leva123 Новичок

    С нами с:
    22 янв 2020
    Сообщения:
    36
    Симпатии:
    0
    Помогите пожалуйста, совсем уж не могу сообразить с элементарной задачей.
    Совсем уже потерял веру в решение данной задачи. В инете есть подобные решения с использованием функции подсчета количесва одинаковых значений но это не то что нужно.
    $arr = [1,2,3,4,4,4,5,6,7,8,9,9,9];
    Как мне вывести на экран одинаковые значения.
    писал что то вроде:
    $arr = [1,2,3,4,4,4,5,6,7,8,9,9,9];

    for($i=0;$i < count($arr);$i++{

    if($arr[$i] == $arr[$i+1] or $arr[$i] == $arr[$i +2]{
    echo $arr[$i];
    }

    }
     
  2. KingdaKa

    KingdaKa Новичок

    С нами с:
    7 сен 2021
    Сообщения:
    55
    Симпатии:
    11
    Что значит вывести одинаковые значения? Приведите пример как это должно выглядеть.
    Значения массива только цифры или числа или строки могут быть?
     
  3. Leva123

    Leva123 Новичок

    С нами с:
    22 янв 2020
    Сообщения:
    36
    Симпатии:
    0
    Чтоб на экран вывелись '4,4,4 и 9,9,9'. Как то так...
     
  4. KingdaKa

    KingdaKa Новичок

    С нами с:
    7 сен 2021
    Сообщения:
    55
    Симпатии:
    11
    Код (Text):
    1. <?php
    2.  
    3. $arr = [1, 2, 2, 2, 3, 4, 4, 5, 6, 6, 7, 9, 9, 9, 5];
    4.  
    5. $p = NULL; // Предыдущее значение
    6. $buff = ''; // Накопительный буфер
    7. do {
    8.     $n = array_shift($arr); // Текущее значение
    9.     if ($n == $p) {
    10.         $buff .= $n;
    11.     } else {
    12.         if (strlen($buff) > 1) {
    13.             echo $buff . "<br>";
    14.         }
    15.         $buff = $p = $n;
    16.     }
    17. } while ($n);
    Вместо буфера можно использовать счетчик, но мне кажется с буфером корректнее.
     
    Leva123 нравится это.
  5. Leva123

    Leva123 Новичок

    С нами с:
    22 янв 2020
    Сообщения:
    36
    Симпатии:
    0
    Спасибо)Почему выбрал именно do while?)Обьяснишь?
     
  6. KingdaKa

    KingdaKa Новичок

    С нами с:
    7 сен 2021
    Сообщения:
    55
    Симпатии:
    11
    Больше нравится :) Так лучше?

    Код (Text):
    1. <?php
    2.  
    3. $arr = [1, 2, 2, 2, 3, 4, 4, 5, 6, 6, 7, 9, 9, 9, 5];
    4.  
    5. $p = NULL; // Предыдущее значение
    6. $buff = ''; // Накопительный буфер
    7. while ($n = array_shift($arr)) {
    8.      // Текущее значение
    9.     if ($n == $p) {
    10.         $buff .= $n;
    11.     } else {
    12.         if (strlen($buff) > 1) {
    13.             echo $buff . "<br>";
    14.         }
    15.         $buff = $p = $n;
    16.     }
    17. }
    А в массиве именно цифры или может быть что-то другое? А то можно было бы другое решение выбрать.
     
  7. Leva123

    Leva123 Новичок

    С нами с:
    22 янв 2020
    Сообщения:
    36
    Симпатии:
    0
    Я тебе там отписал.
     
  8. Slava Rozhnev

    Slava Rozhnev Новичок

    С нами с:
    6 сен 2021
    Сообщения:
    25
    Симпатии:
    11
    Адрес:
    https://phpize.online
    Изучаем функции работы с массивами и делаем следующее:
    PHP:
    1. <?php
    2. $arr = [1,2,3,4,4,4,5,6,7,8,9,9,9];
    3.  
    4. // Считаем количество значений
    5. $count_values = array_count_values($arr);
    6.  
    7. print_r($count_values);
    8.  
    9. // Фильтруем те которых больше 1
    10. $repits = array_filter($count_values, fn($el) => $el > 1);
    11.  
    12. print_r($repits);

    PHP array_count_values & array_filter online
     
    artoodetoo и MouseZver нравится это.
  9. KingdaKa

    KingdaKa Новичок

    С нами с:
    7 сен 2021
    Сообщения:
    55
    Симпатии:
    11
    @Slava Rozhnev, написано же в первом сообщении - это не то, что нужно. Так каждый дурак может сделать ;)
    Представьте, что надо написать этот алгоритм на ассемблере.
     
  10. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.184
    Симпатии:
    1.198
    Адрес:
    Лень
    Вместо фильтра
    PHP:
    1. $result = array_diff ( $count_values, [ 1 ] );
     
    Slava Rozhnev нравится это.
  11. KingdaKa

    KingdaKa Новичок

    С нами с:
    7 сен 2021
    Сообщения:
    55
    Симпатии:
    11
    Как будет работать, если массив вот такой?

    1. $arr = [1,2,3,4,4,4,5,6,7,8,9,9,9,4,4,4,4,4,3,2,2,2,0,0,1,1,1,5];
    Надо вывести
    444
    999
    44444
    222
    00
    111
     
  12. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.184
    Симпатии:
    1.198
    Адрес:
    Лень
    Ебать меня в жопу, ты прав
     
  13. KingdaKa

    KingdaKa Новичок

    С нами с:
    7 сен 2021
    Сообщения:
    55
    Симпатии:
    11
    Зачем же так круто (с) :D:D:D
     
  14. Slava Rozhnev

    Slava Rozhnev Новичок

    С нами с:
    6 сен 2021
    Сообщения:
    25
    Симпатии:
    11
    Адрес:
    https://phpize.online
    Например так (используем str_repeat):
    PHP:
    1. <?php
    2. $arr = $arr = [1,2,3,4,4,4,5,6,7,8,9,9,9,4,4,4,4,4,3,2,2,2,0,0,1,1,1,5];
    3.  
    4. // Считаем количество значений
    5. $count_values = array_count_values($arr);
    6.  
    7. // Фильтруем те котовых больше 1
    8. $repits = array_diff( $count_values, [ 1 ] );
    9.  
    10. foreach($repits as $v=>$count) {
    11.     echo str_repeat($v, $count) . PHP_EOL;
    12. }
    PHP str_repeat code online
     
  15. KingdaKa

    KingdaKa Новичок

    С нами с:
    7 сен 2021
    Сообщения:
    55
    Симпатии:
    11
    @Slava Rozhnev, результат выполнения:

    1111 2222 33 44444444 55 999 00
    а надо
    444 999 44444 222 00 111

    Вы разницу не видите? :)
     
  16. Slava Rozhnev

    Slava Rozhnev Новичок

    С нами с:
    6 сен 2021
    Сообщения:
    25
    Симпатии:
    11
    Адрес:
    https://phpize.online
    Где в вопросе говорится про идущие подряд одинаковые значения?

    Нужен правильный ответ - напишите грамотный вопрос
     
    don.bidon нравится это.
  17. KingdaKa

    KingdaKa Новичок

    С нами с:
    7 сен 2021
    Сообщения:
    55
    Симпатии:
    11
    Зато есть вот что:
    "В инете есть подобные решения с использованием функции подсчета количесва одинаковых значений но это не то что нужно."

    А ниже код, который как бы намекает на то, что таки нужно.

    ;)

    Я согласен, что вопрос задан не очень чётко. Но судя по всему это беда многих вопросов не только здесь :)
     
  18. Slava Rozhnev

    Slava Rozhnev Новичок

    С нами с:
    6 сен 2021
    Сообщения:
    25
    Симпатии:
    11
    Адрес:
    https://phpize.online
    А если так:
    PHP:
    1. <?php
    2.  
    3. $arr = [1,2,3,4,4,4,5,6,7,8,9,9,9,4,4,4,4,4,3,2,2,2,0,0,1,1,1,5];
    4.  
    5. preg_match_all('/1{2,}|2{2,}|3{2,}|4{2,}|5{2,}|6{2,}|7{2,}|8{2,}|9{2,}|0{2,}/', implode($arr), $m);
    6.  
    7. print_r($m[0]);
    PHP preg_match_all online

    Код (Text):
    1. Array
    2. (
    3.     [0] => 444
    4.     [1] => 999
    5.     [2] => 44444
    6.     [3] => 222
    7.     [4] => 00
    8.     [5] => 111
    9. )
     
  19. KingdaKa

    KingdaKa Новичок

    С нами с:
    7 сен 2021
    Сообщения:
    55
    Симпатии:
    11
    Я вижу вы не унимаетесь :) С объединением в строку цифр и регуляркой - это самый очевидный вариант, но есть маленькая проблема - у нас массив, а элементами может быть что угодно. Вместо цифр могут быть буквы или вообще слова ;-)

    Но респект за упорство ;)
     
  20. Slava Rozhnev

    Slava Rozhnev Новичок

    С нами с:
    6 сен 2021
    Сообщения:
    25
    Симпатии:
    11
    Адрес:
    https://phpize.online
    Это я так, развлечения ради. Я думаю мы можем закрыть тему. К тому же топик-стартер никак не реагирует. :rolleyes:
     
  21. Leva123

    Leva123 Новичок

    С нами с:
    22 янв 2020
    Сообщения:
    36
    Симпатии:
    0
    Моя реакция тут бессмысленна)
     
  22. Sviridov

    Sviridov Новичок

    С нами с:
    22 сен 2021
    Сообщения:
    23
    Симпатии:
    4
    юзайте array_walk, зачем вам эти циклы каждый раз городить?