Доброго времени суток. Прошу помочь обработата массив. Сначала немного предыстории. В массиве вся информация о товаре, меня,конкретно интересуют поля, отвечающикюе за фильтрацию. Вот так выглядит часть массива $product PHP: Array ( //остальные поля товара [filter_name_1] => Мощность [filter_name_2] => Обмотка [filter_name_3] => Вольтаж [filter_content_1] => 25 VA(Вт) [filter_content_2] => медь [filter_content_3] => 12/24/36v //остальные поля товара ) Array ( //остальные поля товара [filter_name_1] => Мощность [filter_name_2] => Обмотка [filter_name_3] => Сила тока [filter_content_1] => 20 VA(Вт) [filter_content_2] => алюминий [filter_content_3] => 1/5/12А //остальные поля товара ) Array ( //остальные поля товара [filter_name_1] => Мощность [filter_name_2] => Обмотка [filter_name_3] => Вольтаж [filter_content_1] => 30 VA(Вт) [filter_content_2] => медь [filter_content_3] => 24/36/64v //остальные поля товара ) Мне необходимо склеить все эти массивы, что бы вышло что-то вроде: PHP: Array ( [option] => Array( [name] => Мощность, [value] => ['25 VA(Вт)', '20 VA(Вт)', '30 VA(Вт)'] ), [option] => Array( [name] => Обмотка, [value] => ['медь', 'алюминий'] ), [option] => Array( [name] => ['Вольтаж', 'Сила тока'], [value] => Array( [0] => ['12/24/36v', '24/36/64v'], [0] => ['1/5/12А'] ) ) ) Я пытался сделать это с помощью тех знаний который имеются, но в итоге вышел монстр от которого так и несло кощунством, по этому я не стал его дорабатывать. Вот собственно он: PHP: $name_1 = []; $name_2 = []; $name_3 = []; $value_1 = []; $value_2 = []; $value_3 = []; foreach ($data['this_product'] as $singel) { array_push($name_1, $singel['filter_name_1']); array_push($name_2, $singel['filter_name_2']); array_push($name_3, $singel['filter_name_3']); array_push($value_1, $singel['filter_content_1']); array_push($value_2, $singel['filter_content_2']); array_push($value_3, $singel['filter_content_3']); } $filter = array( 'option' => array( 'name' => array_unique( $name_1 ), 'value' => array_unique( $value_1 ) ), 'option' => array( 'name' => array_unique( $name_2 ), 'value' => array_unique( $value_2 ) ), 'option' => array( 'name' => array_unique( $name_3 ), 'value' => array_unique( $value_3 ) ) ); Буду крайне признателен за наставления)
PHP: function getFilters($inputArray){ $result = []; $i = 1; while(true){ $nameKey = 'filter_name_'.$i; $valKey = 'filter_content_'.$i; if(!empty($inputArray[$nameKey])){ break; } $result[] = [ 'name' => $inputArray[$nameKey], 'value' => $inputArray[$valKey] ]; $i++; } return $result; } --- Добавлено --- тоже монстр получился)
@TeslaFeo чёт мне кажется функция слегка не верна, но в правильном направлении. --- Добавлено --- надо !empty заменить на empty и всё будет окай --- Добавлено --- и нет не всё окай посмотри у него там куча массивов и он хочет со всех данные собрать... То. есть в результате у нас должно получиться всего три массива. --- Добавлено --- 1 Мощность 2 Обмотка 3 Вольтаж, сила тока
Большое спасибо за энтузиазм) Я первым делом проверил алгоритм @TeslaFeo, заменив !empty на empty. Но получил пустой массив( @askanim, Вы судя по всему уже поняли почему, спасибо что пытаетесь найти решение. Относительно вашего первого вопроса - массив это вывод из таблицы в БД.
@smartCreate странное хранение данных чес слово ну ладно я сейчас найду решение, и дам вам знать ждите. А потом расскажу как лучше хранить данные в бд, или пусть сделает пока кто нить другой пока я решаю головоломку. Но скор сделаю. --- Добавлено --- сделает в смысле расскажет )
@askanim, спасибо) я знаю что странное и знаю как было бы лучше. Дело в том что мне этот проект передали уже в готовом виде. А менять структуру таблицы не вариант, потому как там более 10 000 товарных позиций. И все на сайте держится на той структуре которая есть. Вот и попал в сложную ситуацию(
там цикл твой в true не пашет. --- Добавлено --- на фор переделал заработало, но остаётся другая проблема посмотри ТС внимательно
Исходные структуры данных очень плохие. Избыточность, неоднозначность логики. Почему вольтаж и сила тока вдруг оказались в одной графе? До этого name были уникальны.
Лови и радуйся PHP: function getFilters($inputArray){ $result = []; for ($i=1;$i<4;$i++) { $nameKey = 'filter_name_'.$i; $valKey = 'filter_content_'.$i; if(empty($inputArray[$nameKey])){ break; } $result[] = [ 'uniq' => $nameKey, 'name' => [0 => $inputArray[$nameKey]], 'value' => [0 => $inputArray[$valKey]] ]; } return $result; } function prepareGetFilters($inputArray) { $res = []; foreach ($inputArray As $key) { $result = getFilters($key); if (!empty($res)) { $i = 0; $it = 1; foreach ($res As $kk) { $nameKey = 'filter_name_'.$it; foreach ($result As $k) { if ($k['uniq'] == $nameKey) { if ($res[$i]['name'][0] != $k['name'][0]) $res[$i]['name'][] = $k['name'][0]; if ($res[$i]['value'][0] != $k['value'][0]) $res[$i]['value'][] = $k['value'][0]; } } $i++; $it++; } }else { $res = $result; } } return $res; } $inputArr = [ [ 'filter_name_1' => 'Мощность', 'filter_name_2' => 'Обмотка', 'filter_name_3' => 'Вольтаж', 'filter_content_1' => '25 VA(Вт)', 'filter_content_2' => 'медь', 'filter_content_3' => '12/24/36v' ], [ 'filter_name_1' => 'Мощность', 'filter_name_2' => 'Обмотка', 'filter_name_3' => 'Вольтаж', 'filter_content_1' => '25 VA(Вт)', 'filter_content_2' => 'медь', 'filter_content_3' => '12/24/36v' ], [ 'filter_name_1' => 'Мощность', 'filter_name_2' => 'Обмотка', 'filter_name_3' => 'Вольтаж', 'filter_content_1' => '25 VA(Вт)', 'filter_content_2' => 'медь', 'filter_content_3' => '12/24/36v' ], [ 'filter_name_1' => 'Мощность Ват', 'filter_name_2' => 'Материал обмотки', 'filter_name_3' => 'Сила тока', 'filter_content_1' => '25 VA(Вт)', 'filter_content_2' => 'медь', 'filter_content_3' => '16/28/36v' ] ]; $ar = prepareGetFilters($inputArr); echo '<pre>'; print_r($ar); echo '</pre>';
Я повторюсь, о том что структурные данные очень плохие - я знаю. Но это просто факт с которым я не могу нечего поделать. На счет вот этого: Это интернет магазин силового оборудования (трансформаторы, РУ и т.д.), есть группа например Асинхронные двигатели. А они разделяются дополнительно на двигатели с короткозамкнутым ротором, и фазным ротором. Если двигатель с КЗ ротором то он характеризуется по Силе тока, а если с фазным то по Вольтажу. Вот так они и оказались в одной графе. @askanim, я не совсем понял вот это: и вот это: Это вопросы ко мне или вы обращались к другим собеседниками ?)
Берёшь все свои массивы собераешь в один и кладёшь в функцию prepareGetFilters($inputArr) и будет тебе счастье --- Добавлено --- к другим я сделал то что ты хотел всё работает как ты и написал в тс --- Добавлено --- Но это конечно жесть что там происходит но по другому я не знаю как. --- Добавлено --- только добавился ещё ключ один uniq но от него нельзя избавиться это ключевое слово связывает массивы чтобы они не повторялись.
пусть будет вот так ($i=1;$i<999999999999;$i++) или вот так $i==true, всё равно выход там предусмотрен. в чём проблема не вижу проблемы
@TeslaFeo нет цикл уже в моей второй функции не надо экспериментировать. --- Добавлено --- @TeslaFeo пусть сделает вот так значит $i==true и будет счастье не вижу проблемы --- Добавлено --- самый геморой сейчас был дебаг циклов --- Добавлено --- @smartCreate куда ты там пропал всё получилось у тебя или нет?
А что он хотел он и одной строки хотел слепить многоуровневый массив. Я сделал ему. И он работает лучше не придумать. Функций у пыха для подобных ситуаций я не обнаружил. все функции по склейке здесь не подходят значит ток этот вариант --- Добавлено --- А взрыв к чему?