Фильтрация массива.

Тема в разделе "Как сделать...", создана пользователем zartsergey, 25 мар 2014.

  1. zartsergey

    zartsergey Постоялец

    Регистр.:
    1 окт 2013
    Сообщения:
    69
    Симпатии:
    6
    Доброго времени суток!
    Есть массив, который состоит из чисел.
    Данные в нем повторяются.
    Как оставить данные которые встречается не менее чем, допустим, 6 раз. А те которые менее чем 6 раз - удалить.
    Т.е. например

    Код:
    3
    4
    2
    4
    1
    4
    6
    4
    9
    4
    8
    4
    В данном случае из массива должны быть удалены все числа, кроме 4. Позиций очень много.
    Уже голову сломал над этим =(
    Спасибо!

    Очепятался, недосып.
    Как оставить данные которые встречается не менее чем 6 раз. А остальные удалить.
     
    Последнее редактирование модератором: 25 мар 2014
  2. UJy

    UJy

    Регистр.:
    23 авг 2011
    Сообщения:
    351
    Симпатии:
    124
    Влом писать код, но наводку на решение дам. Решение высечено топором из камня, и затратно по ресурсам, но я бы делал так (ибо нубокодер).
    Итак случай, когда нужно УБИТЬ ВСЕ ДАННЫЕ, КОТОРЫЕ ВСТРЕЧАЮТСЯ МЕНЬШЕ 4 РАЗ:
    1) Сортируешь массив по возрастанию
    2) Присваиваешь переменной $i = count($tvoiMassiv); Получаешь в переменную количество значений твоего массива
    3) обьявляешь остановочную переменную $stopper = 0;
    4) делаешь цикл
    Код:
    while ($stopper <= $i-4) {
       if(!($tvoiMassiv[$stopper] == $tvoiMassiv[$stopper+1]  && $tvoiMassiv[$stopper+1] == $tvoiMassiv[$stopper+2] && $tvoiMassiv[$stopper+2] == $tvoiMassiv[$stopper+3])) {
          unset($tvoiMassiv[$stopper]);
          }
       if ($tvoiMassiv[$stopper] == $tvoiMassiv[$stopper+1]  && $tvoiMassiv[$stopper+1] == $tvoiMassiv[$stopper+2] && $tvoiMassiv[$stopper+2] == $tvoiMassiv[$stopper+3]) {
          $stopper = $stopper+3;
          }
       $stopper++;
       }
    Получается ты сортируешь массив, сравниваешь 4 элемента подряд, если они не одинаковые, удаляешь первый, сравниваешь следующие 4, удаляешь один. Если 4 оказываются одинаковые - перепрыгиваешь эти 4 элемента (3 при проверки ифом, 1 перед выходом из цикла).

    PS: недочитал задание, там "не менее", над этим нужно подумать...

    Дружище, забудь, то что было в этом посте.
    Неоттестил говнокод, работать не будет, сорри за плохой совет :)
     
    Последнее редактирование модератором: 25 мар 2014
    zartsergey нравится это.
  3. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.517
    Симпатии:
    1.365
  4. Denixxx

    Denixxx

    Регистр.:
    7 фев 2014
    Сообщения:
    247
    Симпатии:
    194
    PHP:
    //Данные
    $input=array(1,2,2,3,3,3,3,3,3,3,4,4,4,4,2,34,23,1,4,5,4445,5,555,5,7,8,5,9,0,5,4,0);
    $max=5;
    $return=array();

    //Код
    $array=array_count_values($input);
    foreach (
    $array as $key=>$value) {
    if (
    $value $max$return[]=$key;
    }
    var_dump($return);
    Результат:
    Код:
    array(2) {
      [0]=>
      int(3)
      [1]=>
      int(4)
    }