Вход • Регистрация

Уникальные значения в массиве

  • 16 ноября 2017 г.
  • Гуру PHP, обращаюсь к вам.
    Как из данного массива
    1
    1 1
    1 1 1
    1 1 2
    1 1 3
    1 2
    1 2 1
    1 2 2
    1 2 3
    1 3
    1 3 1
    1 3 2
    1 3 3
    2
    3

    Сделать такой?

    1
    1 2
    1 2 3
    1 3
    2
    3
    • 16 ноября 2017 г.
    • Сортировка с поглощением наименьших разрядных чисел :)
      • 16 ноября 2017 г. , редакция: 16 ноября 2017 г.
      • Спасибо!
        А функция стандартная есть?
        • 16 ноября 2017 г.
        • Код
          $array = array(...);
          $array = array_walk(sort(array_unique($array)), $callback);
          • 16 ноября 2017 г.
          • Не понимаю сути, arrya_unique мне в данном случае никак не поможет, все значения итак разные, sort тоже зачем нужен не ясно, во первых все значения итак отсортированы, а во вторых мне абсолютно неважно какая будет сортировка.
            Получается весь прикол должен быть в колбеке, каким то образом сравнивать каждый элемент массива с предыдущим и если допустим сумма одинаковая то в новый массив не кладем. Так?
        • 16 ноября 2017 г.
        • 1. array_unique - исключаем одинаковые значения
          2. sort - сортируем массив (если неизвестно, будет ли упорядоченный массив), так как упрощает следующий этап и сокращает последующий код
          3. array_walk - работаем с массивом через callback, т.е. в callback сравниваем два значения и делаем вывод.
          Итог: почти все в одной простой строке. Чем не функция? :)
          • 16 ноября 2017 г.
          • По 1 и 2 пункту я сказал что не нужны.
            И да, самое главное в коллбеке, что нужно сравнить друг с другом?

            1 2 3 и 1 3 2 будут разными значениями если сравнивать if($i == $q)...

            Вот что то я вообще не врубаюсь, у меня получилось через одно место дойти до такого результата:
            1
            1 2
            1 2 3
            1 3
            1 3 2
            2
            3

            Но опять таки не верное, там присутствует 1 3 2, но у меня уже есть 1 2 3.
    • 16 ноября 2017 г.
    • Ммм... добить нули в конец до 3-х разрядов, рассортировать по возрастанию, снять нули. Если нули есть изначально - как-то пометить. Так, в голову пришло.
      • 16 ноября 2017 г.
      • 1 2 3 это не 123, это отдельные числа, у которых должен быть разделитель, чтобы потом сделать explode, но даже если сделать как Вы говорите

        берем 123 и 132, делаем функцию уник, и что? как мне избавиться от одного из них? Уник не сработает, для него это разные цифры.

        Или я чего то сильно не догоняю?
        • 16 ноября 2017 г. , редакция: 16 ноября 2017 г.
        • Сразу дисклеймер - я у мамки программист и все такое и вообще ничего не читал;
          Массив: 10, 1, 123, 23,132 преобразовать в 100z1, 100z2, 123z0, 230z1, 132z0;
          explode по символу z
          рассортировать по значнию 1-го элемента
          отлепить нули, исходя из значения 2-го элемента

          Косяк, правда, в том, что тут 10, 1 и 100 будут восприниматься одинаково, но, полагаю, какой-нить костыль додумать можно
          • 16 ноября 2017 г. , редакция: 16 ноября 2017 г.
          • В итоге мы уберем 132 или 123?
            • 16 ноября 2017 г.
            • А, все теперь я вкурил, что надо)) Я правильно понял, что нужно убрать элементы с повторяющимися цифрами в разрядах, а то что останется - рассортировать по образу и подобию оригинала?
              • 16 ноября 2017 г.
              • Я не совсем понял Ваш вопрос. Проще я сразу приведу нормальный пример того что нужно.

                Имеем:
                Цитата

                array(
                [key] = 1,
                [key] = 1, 1,
                [key] = 1, 1, 1,
                [key] = 1, 1, 2,
                [key] = 1, 1, 3,
                [key] = 1, 2,
                [key] = 1, 2, 1,
                [key] = 1, 2, 2,
                [key] = 1, 2, 3,
                [key] = 1, 3,
                [key] = 1, 3, 1,
                [key] = 1, 3, 2,
                [key] = 1, 3, 3,
                [key] = 2,
                [key] = 3,
                );


                Нужно оставить:

                Код

                array(
                [key] = 1,
                [key] = 1, 2,
                [key] = 1, 2, 3,
                [key] = 1, 3,
                [key] = 2,
                [key] = 3,
                );

                Правда в наборе не хватает значения 2 3, но это уже другая песня)) По факту изначально вообще имеется такой массив:

                Код

                Array
                (
                [0] => 1
                [1] => 1 1
                [2] => 1 1 1
                [3] => 1 1 2
                [4] => 1 1 3
                [5] => 1 2
                [6] => 1 2 1
                [7] => 1 2 2
                [8] => 1 2 3
                [9] => 1 3
                [10] => 1 3 1
                [11] => 1 3 2
                [12] => 1 3 3
                [13] => 2
                [14] => 2 1
                [15] => 2 1 1
                [16] => 2 1 2
                [17] => 2 1 3
                [18] => 2 2
                [19] => 2 2 1
                [20] => 2 2 2
                [21] => 2 2 3
                [22] => 2 3
                [23] => 2 3 1
                [24] => 2 3 2
                [25] => 2 3 3
                [26] => 3
                [27] => 3 1
                [28] => 3 1 1
                [29] => 3 1 2
                [30] => 3 1 3
                [31] => 3 2
                [32] => 3 2 1
                [33] => 3 2 2
                [34] => 3 2 3
                [35] => 3 3
                [36] => 3 3 1
                [37] => 3 3 2
                [38] => 3 3 3
                [39] =>
                )
            • 16 ноября 2017 г. , редакция: 16 ноября 2017 г.
            • Выстраиваем в ряд как отдельные числа (по возрастанию) а потом объединяешь и сравниваешь - есть такой или нет....
              • 16 ноября 2017 г.
              • Сначала нужно будет каждый набор превратить в массив, после отсортировать, затем вставить в новый массив, и в конце сделать уник?

                Должно сработать))) Буду пробовать.)) Спасибо!.
              • 16 ноября 2017 г.
              • Сразу одна хрень, а как уберутся 3 3 3 ?)))

                Тут нужно метод в методе использовать короче)) маленького кода не выйдет.
              • 16 ноября 2017 г.
              • Где числа все одного значения сведи к 1 занчению

                3, 3, 3 = 3
                2, 2 = 2

        • 16 ноября 2017 г.
        • По видимому, как точнее писать вопрос
          Я, например, тоже подумал что 123, а не то, что это по сути
          Код

          [
          [1,],
          [1, 1.],
          [1, 1, 2,],
          [1, 2, 3,],
          [.......],
          ]
          • 16 ноября 2017 г.
          • Да у меня просто уже голова кипит.

            Сейчас еще больше заболела, нужно автоматизировать цикл в цикле, потому что их может быть разное кол-во.

            П%;?@Ц какой то.
          • 16 ноября 2017 г.
          • Ммм... преобразовать элемент изначального массива в строку, разбить на символы, проверить на повторение символов, если повторяются - привесить какую-нить метку. Прогнать весь массив через это дело, все помеченные снести, то, что останется - рассортировать, как до этого предлагал. Ну, я бы так мыслил.
            • 16 ноября 2017 г. , редакция: 16 ноября 2017 г.
            • Интересно, но! Как этот метод уберет 1 3 2? В этом наборе нет повторяющихся цифр. Как и в этом 1 2 3
              • 16 ноября 2017 г.
              • Ептить. Так, теперь помедленнее. По какому признаку мы выбираем, какой из 123 и 132 мы убираем? Мне пока они оба нравятся одинаково.
              • 16 ноября 2017 г. , редакция: 16 ноября 2017 г.
              • 1) Берём массива [1, 3, 2]
                2) Сортируем = [1, 2, 3]
                3) Сравниваем с предыдущими...

                Выше уже объяснил

                Спасибо - много а 100 руб. хватит)))
  • 16 ноября 2017 г.
  • Всем спасибо, я сейчас пробую из всего что сказано, повожусь, отпишу о результатах))))
  • 16 ноября 2017 г.
  • Итак, я добился вот чего:

    Код

    Array
    (
    [0] => 1
    [1] => 1 1
    [2] => 1 1 1
    [3] => 1 1 2
    [4] => 1 1 3
    [5] => 1 2
    [7] => 1 2 2
    [8] => 1 2 3
    [9] => 1 3
    [12] => 1 3 3
    [13] => 2
    [18] => 2 2
    [20] => 2 2 2
    [21] => 2 2 3
    [22] => 2 3
    [25] => 2 3 3
    [26] => 3
    [35] => 3 3
    [38] => 3 3 3
    [39] =>
    )


    Это по способу Дмитрия.

    Дмитрий, Вы мне сказали:
    Цитата
    Где числа все одного значения сведи к 1 занчению3, 3, 3 = 32, 2 = 2


    Уже голова не соображает, есть функция которая определит что в массиве все значения одинаковые?
    • 16 ноября 2017 г.
    • Полученный результат из чисел [1], [2], [3]
      Вноси вне цикла выборки и сортировки а после где собираешься вносить в основной массив с проверкой :

      Если в выборке все три или два или более значения одинаковые 3, 3, 3 = своди к одному из них и "3" и проверяй на уникальность в основном массиве....

      и тогда значения типа - 2, 2 или 2, 2, 2 отвалятся....


      Зависимые характеристики делаешь чтоль?
      • 16 ноября 2017 г.
      • Автоматическую генерацию ссылок на фильтр делаю.

        Можно подробней пожалуйста как сравнивать, не догоняю.

        Цитата
        Если в выборке все три или два или более значения одинаковые

        Как это узнать?
        • 16 ноября 2017 г.
        • Ну самое простое что в голову пришло
          В функцию кидаешь массив -> а в функции присваиваешь контрольной переменной первое значение из массива и обходя последующие значения сравниваешь с контрольным (в переменной куда пихнул значение)

          Если совпало прибавь щётчику к примеру count++

          после обхода сравни count числа совпадений с длинной массива
          если значения разные - вернёшь из функции False

          Думаю это можно как то изящнее сделать но я уже стар и без ухода в мануалы хрен чего накидаю....
          • 16 ноября 2017 г.
          • Это первое что я сделал)))) Че то у меня там так много было кода, что я запутался в какой то миг и пошел другой дорогой и сделал))

            Вы 100 рублей хотели, давайте телефон свой)))))
            • 16 ноября 2017 г.
            • Рад за тебя, это я шутил про сто рублей)))
      • 16 ноября 2017 г.
      • Если брать сразу на готовом примере:

        Код

        Array
        (
        [0] => 27
        [1] => 27 | 27
        [2] => 27 | 27 | 27
        [3] => 18 | 27 | 27
        [5] => 18 | 27
        [7] => 18 | 18 | 27
        [13] => 18
        [18] => 18 | 18
        [20] => 18 | 18 | 18
        )


        Вот отсюда уже нужно убрать то о чем говорили) И я буду на 7 небе.
  • 16 ноября 2017 г.
  • Я сделал. Всем спасибо!

    Итого:

    Код

    Array
    (
    [0] => 20
    [1] => 17 | 20
    [2] => 17 | 20 | 23
    [3] => 17 | 18 | 20 | 23
    [4] => 17 | 18 | 20 | 22 | 23
    [5] => 17 | 18 | 19 | 20 | 23
    [7] => 17 | 20 | 22 | 23
    [9] => 17 | 19 | 20 | 22 | 23
    [11] => 17 | 19 | 20 | 23
    [19] => 17 | 18 | 20
    [24] => 17 | 18 | 20 | 22
    [26] => 17 | 18 | 19 | 20 | 22
    [28] => 17 | 18 | 19 | 20
    [36] => 17 | 20 | 22
    [45] => 17 | 19 | 20 | 22
    [53] => 17 | 19 | 20
    [87] => 20 | 23
    [105] => 18 | 20 | 23
    [110] => 18 | 20 | 22 | 23
    [112] => 18 | 19 | 20 | 22 | 23
    [114] => 18 | 19 | 20 | 23
    [122] => 20 | 22 | 23
    [131] => 19 | 20 | 22 | 23
    [139] => 19 | 20 | 23
    [173] => 18 | 20
    [208] => 18 | 20 | 22
    [217] => 18 | 19 | 20 | 22
    [225] => 18 | 19 | 20
    [259] => 20 | 22
    [311] => 19 | 20 | 22
    [345] => 19 | 20
    [517] => 17
    [604] => 17 | 23
    [622] => 17 | 18 | 23
    [627] => 17 | 18 | 22 | 23
    [629] => 17 | 18 | 19 | 22 | 23
    [631] => 17 | 18 | 19 | 23
    [639] => 17 | 22 | 23
    [648] => 17 | 19 | 22 | 23
    [656] => 17 | 19 | 23
    [690] => 17 | 18
    [725] => 17 | 18 | 22
    [734] => 17 | 18 | 19 | 22
    [742] => 17 | 18 | 19
    [776] => 17 | 22
    [828] => 17 | 19 | 22
    [862] => 17 | 19
    [1034] => 23
    [1207] => 18 | 23
    [1242] => 18 | 22 | 23
    [1251] => 18 | 19 | 22 | 23
    [1259] => 18 | 19 | 23
    [1293] => 22 | 23
    [1345] => 19 | 22 | 23
    [1379] => 19 | 23
    [1551] => 18
    [1810] => 18 | 22
    [1862] => 18 | 19 | 22
    [1896] => 18 | 19
    [2068] => 22
    [2413] => 19 | 22
    [2585] => 19
    )



    А вот какой огромный код: (тут без сбора первичного массива)

    Код

    $array_params_matrix = explode(',', $params_matrix);
    $array_param = '';
    foreach($array_params_matrix AS $arr_p_m){
    $array_param .= $arr_p_m.',';
    foreach($array_params_matrix AS $arr_p_m_ch){
    $array_param .= $arr_p_m == $arr_p_m_ch ? '' : $arr_p_m.$arr_p_m_ch.',';
    foreach($array_params_matrix AS $arr_p_m_ch_ch){
    $array_param .= $arr_p_m == $arr_p_m_ch || $arr_p_m == $arr_p_m_ch_ch || $arr_p_m_ch == $arr_p_m_ch_ch ? '' : $arr_p_m.$arr_p_m_ch.$arr_p_m_ch_ch.',';
    foreach($array_params_matrix AS $arr_p_m_ch_ch_ch){
    $array_param .= $arr_p_m == $arr_p_m_ch || $arr_p_m == $arr_p_m_ch_ch || $arr_p_m == $arr_p_m_ch_ch_ch || $arr_p_m_ch == $arr_p_m_ch_ch || $arr_p_m_ch == $arr_p_m_ch_ch_ch || $arr_p_m_ch_ch == $arr_p_m_ch_ch_ch ? '' : $arr_p_m.$arr_p_m_ch.$arr_p_m_ch_ch.$arr_p_m_ch_ch_ch.',';
    foreach($array_params_matrix AS $arr_p_m_ch_ch_ch_ch){
    $array_param .= $arr_p_m == $arr_p_m_ch || $arr_p_m == $arr_p_m_ch_ch || $arr_p_m == $arr_p_m_ch_ch_ch || $arr_p_m == $arr_p_m_ch_ch_ch_ch || $arr_p_m_ch == $arr_p_m_ch_ch || $arr_p_m_ch == $arr_p_m_ch_ch_ch || $arr_p_m_ch == $arr_p_m_ch_ch_ch_ch || $arr_p_m_ch_ch == $arr_p_m_ch_ch_ch || $arr_p_m_ch_ch == $arr_p_m_ch_ch_ch_ch || $arr_p_m_ch_ch_ch == $arr_p_m_ch_ch_ch_ch ? '' : $arr_p_m.$arr_p_m_ch.$arr_p_m_ch_ch.$arr_p_m_ch_ch_ch.$arr_p_m_ch_ch_ch_ch.',';
    }
    }
    }
    }
    }
    $result_array_params_parents = explode(',', $array_param);
    $array_params = array();
    foreach($result_array_params_parents AS $row_array_params_parents){
    $array_params[] = explode('|', $row_array_params_parents);
    }
    array_pop($array_params);
    array_pop($array_params);
    $result_params = array();
    foreach($array_params AS $new_array_test_child){
    sort($new_array_test_child);
    array_shift($new_array_test_child);
    $new_array_test_child_new = implode(' | ', $new_array_test_child);
    $result_params[] = $new_array_test_child_new;
    }
    $result_array_params = array_unique($result_params);
    array_pop($result_array_params);


    print_r($result_array_params);



Новости

  • 18 июня
  • В сборке большое обновление demo-шаблона, дополнительная защита от спама, улучшение YML-импорта и еще много важного и интересного.
  • 24 апреля
  • В новой сборке совершили революцию в структурировании кастомизированной информации в шаблонах, добавили авторегистрацию пользователей, усовершенствовали защиту от спама, актуализировали накопительную скидку, а также улучшили производительность и стабильность работы системы.
  • 12 января
  • После выхода сборки 7.1 мы выпустили уже три патча, в каждом из которых улучшаем административную часть сайта. Сборка DIAFAN.CMS 7.1.3 уже доступна к установке. 

Форум