За последние 24 часа нас посетили 22413 программистов и 1044 робота. Сейчас ищут 798 программистов ...

Как удалить идущие подряд элементы с одинаковым значением в ассоциативном массиве?

Тема в разделе "PHP для новичков", создана пользователем forever_young, 23 июн 2017.

  1. forever_young

    forever_young Новичок

    С нами с:
    24 мар 2017
    Сообщения:
    26
    Симпатии:
    2
    Вот фрагмент телепрограммы (ассоциативный массив, где время - ключ, а телепередача - значение):

    Код (Text):
    1. 15:40 Махинаторы
    2. 16:05 Махинаторы
    3. 16:35 Золотая лихорадка
    4. 17:30 Выжить любой ценой
    5. 18:25 Выжить любой ценой
    6. 19:20 Выжить любой ценой
    7. 20:15 Как это устроено?
    8. 20:40 Охотники за складами: Британия
    9. 21:10 Склады: битва в Канаде
    10. 21:40 Багажные войны
    11. 22:05 Махинаторы
    12. 22:30 Махинаторы
    Как удалить повторяющиеся тв-передачи идущие друг за другом, но оставить только первую? Спасибо!

    Код (Text):
    1. 15:40 Махинаторы
    2. 16:35 Золотая лихорадка
    3. 17:30 Выжить любой ценой
    4. 20:15 Как это устроено?
    5. 20:40 Охотники за складами: Британия
    6. 21:10 Склады: битва в Канаде
    7. 21:40 Багажные войны
    8. 22:05 Махинаторы
     
  2. Алекс8

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

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    array_unique пробовали?
     
  3. forever_young

    forever_young Новичок

    С нами с:
    24 мар 2017
    Сообщения:
    26
    Симпатии:
    2
    Нет, но я так понял array_unique вообще оставляет первое встречное, а остальные, - неважно идут они подряд или нет, - удаляет. А как насчет next()? Только что-то не соображу, как создать условие...
     
  4. Алекс8

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

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    да я загнался.. array_unique и индексы должен убрать..
    попробуйте так.. может сработает..
    Код (Text):
    1.  
    2. $tmp = '';
    3. foreach($array as $a => $v){
    4.      if($tmp == $v){
    5.           unset($array[$a]);
    6.      }
    7. $tmp = $v;
    8. }
     
    forever_young и TeslaFeo нравится это.
  5. forever_young

    forever_young Новичок

    С нами с:
    24 мар 2017
    Сообщения:
    26
    Симпатии:
    2
    Не уверен, что правильно вас понял... Так?
    PHP:
    1.     $tmp = '';
    2.    
    3.     $arr = array(
    4.     '14:50' => 'Быстрые и громкие',
    5.     '15:40' => 'Махинаторы',
    6.     '16:05' => 'Махинаторы',
    7.     '16:35' => 'Золотая лихорадка',
    8.     '17:30' => 'Выжить любой ценой',
    9.     '18:25' => 'Выжить любой ценой',
    10.     '19:20' => 'Выжить любой ценой',
    11.     '20:15' => 'Как это устроено?',
    12.     '20:40' => 'Охотники за складами: Британия',
    13.     '21:10' => 'Склады: битва в Канаде',
    14.     '21:40' => 'Багажные войны',
    15.     '22:05' => 'Махинаторы',
    16.     '22:30' => 'Махинаторы',
    17.     '23:00' => 'Как это устроено?'
    18.     );
    19.    
    20.     foreach($arr as $a => $v){
    21.             if ($tmp == $v){
    22.                 unset($arr[$a]);
    23.             };
    24.             $tmp = $v;
    25.             print_r($v);
    26.         }
     
  6. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    Там нечего понимать. Решение простейшее и первым приходит в голову.
    Почитай про foreach.
     
  7. forever_young

    forever_young Новичок

    С нами с:
    24 мар 2017
    Сообщения:
    26
    Симпатии:
    2
    Да я и сам чувствую, что простейшее. Знаю, что foreach; только какое в foreach прописать условие, - вот главный вопрос.
     
  8. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    Алекс в коде своём всё написал. Логика следующая:
    Перебираем массив, сравнивая текущий элемент с предыдущим.
    Перед циклом объявлена пустая переменная $tmp.
    В конце каждой итерации в эту переменную заносится текущее значение массива, чтобы сравнить это значение со следующим элементом в следующей итерации, когда текущий элемент уже станет предыдущим, а следующий текущим.
    Если текущий элемент равен предыдущему, то текущий элемент удаляется. Всё.
     
  9. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.744
    Симпатии:
    1.319
    Адрес:
    Лень
  10. forever_young

    forever_young Новичок

    С нами с:
    24 мар 2017
    Сообщения:
    26
    Симпатии:
    2
    Это все понятно. Просто тот, код, который прислал Алекс, нужно немного подправить, а у меня из-за нехватки опыта не получается это сделать.
    --- Добавлено ---
    Вывел $B через print_r, и массив ни чем не отличается от первоначального. Но все равно спасибо!
     
  11. Chushkin

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

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
  12. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.744
    Симпатии:
    1.319
    Адрес:
    Лень
    c foreach короче
     
  13. Chushkin

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

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    И быстрее наверняка и памяти жрёт меньше. Но не так красиво. :)