Писать на форуме DIAFAN.CMS могут только зарегистрированные пользователи. Войдите или зарегистрируйтесь.
Уникальные значения в массиве
-
- Степан (idxdoc)
- 334
-
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 г.
-
Сортировка с поглощением наименьших разрядных чисел :)
-
-
-
-
- Степан (idxdoc)
- 334
-
16 ноября 2017 г. , редакция: 16 ноября 2017 г.
-
Спасибо!
А функция стандартная есть? -
-
-
-
16 ноября 2017 г.
-
Код
$array = array(...);
$array = array_walk(sort(array_unique($array)), $callback); -
-
-
-
- Степан (idxdoc)
- 334
-
16 ноября 2017 г.
-
Не понимаю сути, arrya_unique мне в данном случае никак не поможет, все значения итак разные, sort тоже зачем нужен не ясно, во первых все значения итак отсортированы, а во вторых мне абсолютно неважно какая будет сортировка.
Получается весь прикол должен быть в колбеке, каким то образом сравнивать каждый элемент массива с предыдущим и если допустим сумма одинаковая то в новый массив не кладем. Так? -
-
-
-
-
16 ноября 2017 г.
-
1. array_unique - исключаем одинаковые значения
2. sort - сортируем массив (если неизвестно, будет ли упорядоченный массив), так как упрощает следующий этап и сокращает последующий код
3. array_walk - работаем с массивом через callback, т.е. в callback сравниваем два значения и делаем вывод.
Итог: почти все в одной простой строке. Чем не функция? :) -
-
-
-
- Степан (idxdoc)
- 334
-
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 г.
-
А, тут приличные люди написали уже)
-
-
-
-
- Степан (idxdoc)
- 334
-
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 будут восприниматься одинаково, но, полагаю, какой-нить костыль додумать можно -
-
-
-
- Степан (idxdoc)
- 334
-
16 ноября 2017 г. , редакция: 16 ноября 2017 г.
-
В итоге мы уберем 132 или 123?
-
-
-
-
16 ноября 2017 г.
-
А, все теперь я вкурил, что надо)) Я правильно понял, что нужно убрать элементы с повторяющимися цифрами в разрядах, а то что останется - рассортировать по образу и подобию оригинала?
-
-
-
-
- Степан (idxdoc)
- 334
-
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 г.
-
Выстраиваем в ряд как отдельные числа (по возрастанию) а потом объединяешь и сравниваешь - есть такой или нет....
-
-
Поблагодарили: Степан (idxdoc)
-
-
-
- Степан (idxdoc)
- 334
-
16 ноября 2017 г.
-
Сначала нужно будет каждый набор превратить в массив, после отсортировать, затем вставить в новый массив, и в конце сделать уник?
Должно сработать))) Буду пробовать.)) Спасибо!. -
-
-
-
16 ноября 2017 г.
-
Если в кратце - то да...)))
-
-
-
-
- Степан (idxdoc)
- 334
-
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,],
[.......],
] -
-
-
-
- Степан (idxdoc)
- 334
-
16 ноября 2017 г.
-
Да у меня просто уже голова кипит.
Сейчас еще больше заболела, нужно автоматизировать цикл в цикле, потому что их может быть разное кол-во.
П%;?@Ц какой то. -
-
-
-
16 ноября 2017 г.
-
Ммм... преобразовать элемент изначального массива в строку, разбить на символы, проверить на повторение символов, если повторяются - привесить какую-нить метку. Прогнать весь массив через это дело, все помеченные снести, то, что останется - рассортировать, как до этого предлагал. Ну, я бы так мыслил.
-
-
Поблагодарили: Степан (idxdoc)
-
-
-
- Степан (idxdoc)
- 334
-
16 ноября 2017 г. , редакция: 16 ноября 2017 г.
-
Интересно, но! Как этот метод уберет 1 3 2? В этом наборе нет повторяющихся цифр. Как и в этом 1 2 3
-
-
-
-
16 ноября 2017 г.
-
Ептить. Так, теперь помедленнее. По какому признаку мы выбираем, какой из 123 и 132 мы убираем? Мне пока они оба нравятся одинаково.
-
-
-
-
16 ноября 2017 г.
-
Да уж, задачка.
-
-
-
-
16 ноября 2017 г. , редакция: 16 ноября 2017 г.
-
1) Берём массива [1, 3, 2]
2) Сортируем = [1, 2, 3]
3) Сравниваем с предыдущими...
Выше уже объяснил
Спасибо - много а 100 руб. хватит))) -
-
-
-
16 ноября 2017 г.
-
ну вот да то есть, если чо, кстати)
-
-
-
-
-
-
- Степан (idxdoc)
- 334
-
16 ноября 2017 г.
-
Всем спасибо, я сейчас пробую из всего что сказано, повожусь, отпишу о результатах))))
-
-
-
-
- Степан (idxdoc)
- 334
-
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 г.
-
Не знаю, трудно понять что нужно,
может эти функции:
array_column
или
array_diff_assoc
Там нужно просмотреть, может что другое подойдёт, для обработки массива? -
-
Поблагодарили: Степан (idxdoc)
-
-
-
16 ноября 2017 г.
-
Полученный результат из чисел [1], [2], [3]
Вноси вне цикла выборки и сортировки а после где собираешься вносить в основной массив с проверкой :
Если в выборке все три или два или более значения одинаковые 3, 3, 3 = своди к одному из них и "3" и проверяй на уникальность в основном массиве....
и тогда значения типа - 2, 2 или 2, 2, 2 отвалятся....
Зависимые характеристики делаешь чтоль? -
-
Поблагодарили: Степан (idxdoc)
-
-
-
- Степан (idxdoc)
- 334
-
16 ноября 2017 г.
-
Автоматическую генерацию ссылок на фильтр делаю.
Можно подробней пожалуйста как сравнивать, не догоняю.
ЦитатаЕсли в выборке все три или два или более значения одинаковые
Как это узнать? -
-
-
-
16 ноября 2017 г.
-
Ну самое простое что в голову пришло
В функцию кидаешь массив -> а в функции присваиваешь контрольной переменной первое значение из массива и обходя последующие значения сравниваешь с контрольным (в переменной куда пихнул значение)
Если совпало прибавь щётчику к примеру count++
после обхода сравни count числа совпадений с длинной массива
если значения разные - вернёшь из функции False
Думаю это можно как то изящнее сделать но я уже стар и без ухода в мануалы хрен чего накидаю.... -
-
-
-
- Степан (idxdoc)
- 334
-
16 ноября 2017 г.
-
Это первое что я сделал)))) Че то у меня там так много было кода, что я запутался в какой то миг и пошел другой дорогой и сделал))
Вы 100 рублей хотели, давайте телефон свой))))) -
-
Поблагодарили: Dmitry (afonnikov10)
-
-
-
-
- Степан (idxdoc)
- 334
-
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 небе. -
-
-
-
-
- Степан (idxdoc)
- 334
-
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);
-
-
-
-
16 ноября 2017 г.
-
Красотища! =)
-
-
Поблагодарили: Степан (idxdoc)
-
-
Новости
-
18 июня
-
В сборке большое обновление demo-шаблона, дополнительная защита от спама, улучшение YML-импорта и еще много важного и интересного.
-
24 апреля
-
В новой сборке совершили революцию в структурировании кастомизированной информации в шаблонах, добавили авторегистрацию пользователей, усовершенствовали защиту от спама, актуализировали накопительную скидку, а также улучшили производительность и стабильность работы системы.
-
12 января
-
После выхода сборки 7.1 мы выпустили уже три патча, в каждом из которых улучшаем административную часть сайта. Сборка DIAFAN.CMS 7.1.3 уже доступна к установке.
Блоги
-
24.04.2024
-
Выпустили новую сборку DIAFAN.CMS 7.1.4.
Блоги
-
12.01.2024
-
В данном руководстве познакомим вас с панелью управления DIAFAN.CMS