За последние 24 часа нас посетили 35312 программистов и 1814 роботов. Сейчас ищут 788 программистов ...

Помогите обработать массив.

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

  1. smartCreate

    smartCreate Новичок

    С нами с:
    4 ноя 2016
    Сообщения:
    122
    Симпатии:
    4
    Доброго времени суток.

    Прошу помочь обработата массив. Сначала немного предыстории. В массиве вся информация о товаре, меня,конкретно интересуют поля, отвечающикюе за фильтрацию.

    Вот так выглядит часть массива $product

    PHP:
    1. (
    2.     //остальные поля товара
    3.  
    4.     [filter_name_1] => Мощность
    5.     [filter_name_2] => Обмотка
    6.     [filter_name_3] => Вольтаж
    7.     [filter_content_1] => 25 VA(Вт)
    8.     [filter_content_2] => медь
    9.     [filter_content_3] => 12/24/36v
    10.  
    11.     //остальные поля товара
    12. )
    13.  
    14. (
    15.     //остальные поля товара
    16.  
    17.     [filter_name_1] => Мощность
    18.     [filter_name_2] => Обмотка
    19.     [filter_name_3] => Сила тока
    20.     [filter_content_1] => 20 VA(Вт)
    21.     [filter_content_2] => алюминий
    22.     [filter_content_3] => 1/5/12А
    23.  
    24.     //остальные поля товара
    25. )
    26.  
    27. (
    28.     //остальные поля товара
    29.  
    30.     [filter_name_1] => Мощность
    31.     [filter_name_2] => Обмотка
    32.     [filter_name_3] => Вольтаж
    33.     [filter_content_1] => 30 VA(Вт)
    34.     [filter_content_2] => медь
    35.     [filter_content_3] => 24/36/64v
    36.  
    37.     //остальные поля товара
    38. )
    Мне необходимо склеить все эти массивы, что бы вышло что-то вроде:

    PHP:
    1. (
    2.     [option] => Array(
    3.         [name]  => Мощность,
    4.         [value] => ['25 VA(Вт)', '20 VA(Вт)', '30 VA(Вт)']
    5.     ),
    6.     [option] => Array(
    7.         [name]  => Обмотка,
    8.         [value] => ['медь', 'алюминий']
    9.     ),
    10.     [option] => Array(
    11.         [name]  => ['Вольтаж', 'Сила тока'],
    12.         [value] => Array(
    13.             [0] => ['12/24/36v', '24/36/64v'],
    14.             [0] => ['1/5/12А']
    15.         )
    16.     )
    17. )
    Я пытался сделать это с помощью тех знаний который имеются, но в итоге вышел монстр от которого так и несло кощунством, по этому я не стал его дорабатывать.

    Вот собственно он:

    PHP:
    1. $name_1 = []; $name_2 = []; $name_3 = [];
    2. $value_1 = []; $value_2 = []; $value_3 = [];
    3.  
    4. foreach ($data['this_product'] as $singel) {
    5.     array_push($name_1, $singel['filter_name_1']);
    6.     array_push($name_2, $singel['filter_name_2']);
    7.     array_push($name_3, $singel['filter_name_3']);
    8.  
    9.     array_push($value_1, $singel['filter_content_1']);
    10.     array_push($value_2, $singel['filter_content_2']);
    11.     array_push($value_3, $singel['filter_content_3']);
    12. }
    13.  
    14. $filter = array(
    15.     'option' => array(
    16.         'name'      => array_unique( $name_1 ),
    17.         'value'     => array_unique( $value_1 )
    18.     ),
    19.     'option' => array(
    20.         'name'      => array_unique( $name_2 ),
    21.         'value'     => array_unique( $value_2 )
    22.     ),
    23.     'option' => array(
    24.         'name'      => array_unique( $name_3 ),
    25.         'value'     => array_unique( $value_3 )
    26.     )
    27. );
    Буду крайне признателен за наставления)
     
    #1 smartCreate, 8 дек 2017
    Последнее редактирование: 8 дек 2017
  2. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    а как ты получаешь эти данные в массиве, откуда они берутся?
     
  3. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    PHP:
    1. function getFilters($inputArray){
    2.   $result = [];
    3.   $i = 1;
    4.  
    5.   while(true){
    6.  
    7.     $nameKey = 'filter_name_'.$i;
    8.     $valKey = 'filter_content_'.$i;
    9.  
    10.     if(!empty($inputArray[$nameKey])){
    11.       break;
    12.     }
    13.  
    14.     $result[] = [
    15.       'name' => $inputArray[$nameKey],
    16.       'value' => $inputArray[$valKey]
    17.     ];
    18.  
    19.     $i++;
    20.   }
    21.  
    22.   return $result;
    23. }
    --- Добавлено ---
    тоже монстр получился)
     
  4. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @TeslaFeo чёт мне кажется функция слегка не верна, но в правильном направлении.
    --- Добавлено ---
    надо !empty заменить на empty и всё будет окай
    --- Добавлено ---
    и нет не всё окай посмотри у него там куча массивов и он хочет со всех данные собрать... То. есть в результате у нас должно получиться всего три массива.
    --- Добавлено ---
    1 Мощность
    2 Обмотка
    3 Вольтаж, сила тока
     
  5. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    точно!
     
  6. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Ща я сижу твой алгоритм дорабатываю пытаюсь слить полученный массив с таким же оставив значения...
     
  7. smartCreate

    smartCreate Новичок

    С нами с:
    4 ноя 2016
    Сообщения:
    122
    Симпатии:
    4
    Большое спасибо за энтузиазм)

    Я первым делом проверил алгоритм @TeslaFeo, заменив !empty на empty. Но получил пустой массив(

    @askanim, Вы судя по всему уже поняли почему, спасибо что пытаетесь найти решение. Относительно вашего первого вопроса - массив это вывод из таблицы в БД.
     
  8. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @smartCreate странное хранение данных чес слово ну ладно я сейчас найду решение, и дам вам знать ждите. А потом расскажу как лучше хранить данные в бд, или пусть сделает пока кто нить другой пока я решаю головоломку. Но скор сделаю.
    --- Добавлено ---
    сделает в смысле расскажет )
     
  9. smartCreate

    smartCreate Новичок

    С нами с:
    4 ноя 2016
    Сообщения:
    122
    Симпатии:
    4
    @askanim, спасибо) я знаю что странное и знаю как было бы лучше. Дело в том что мне этот проект передали уже в готовом виде. А менять структуру таблицы не вариант, потому как там более 10 000 товарных позиций. И все на сайте держится на той структуре которая есть. Вот и попал в сложную ситуацию(
     
  10. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    что ты скормил функции?
    --- Добавлено ---
    распечатай и выложи.
     
  11. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    там цикл твой в true не пашет.
    --- Добавлено ---
    на фор переделал заработало, но остаётся другая проблема посмотри ТС внимательно
     
  12. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Исходные структуры данных очень плохие. Избыточность, неоднозначность логики. Почему вольтаж и сила тока вдруг оказались в одной графе? До этого name были уникальны.
     
    TeslaFeo нравится это.
  13. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    что он хочет на выхлопе получить
     
  14. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    странно... значит надо написать $i > 0
     
  15. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Лови и радуйся
    PHP:
    1. function getFilters($inputArray){
    2.     $result = [];
    3.     for ($i=1;$i<4;$i++) {
    4.         $nameKey = 'filter_name_'.$i;
    5.         $valKey = 'filter_content_'.$i;
    6.  
    7.         if(empty($inputArray[$nameKey])){
    8.             break;
    9.         }
    10.  
    11.         $result[] = [
    12.             'uniq' => $nameKey,
    13.             'name' => [0 => $inputArray[$nameKey]],
    14.             'value' => [0 => $inputArray[$valKey]]
    15.         ];
    16.     }
    17.     return $result;
    18. }
    19. function prepareGetFilters($inputArray) {
    20.     $res = [];
    21.     foreach ($inputArray As $key) {
    22.         $result =  getFilters($key);
    23.         if (!empty($res)) {
    24.             $i = 0;
    25.             $it = 1;
    26.             foreach ($res As $kk) {
    27.                 $nameKey = 'filter_name_'.$it;
    28.                 foreach ($result As $k) {
    29.                     if ($k['uniq'] == $nameKey) {
    30.                         if ($res[$i]['name'][0] != $k['name'][0]) $res[$i]['name'][] = $k['name'][0];
    31.                         if ($res[$i]['value'][0] != $k['value'][0]) $res[$i]['value'][] = $k['value'][0];
    32.                     }
    33.                 }
    34.                 $i++;
    35.                 $it++;
    36.             }
    37.         }else {
    38.             $res = $result;
    39.         }
    40.     }
    41.     return $res;
    42. }
    43. $inputArr = [
    44.     [
    45.         'filter_name_1' => 'Мощность',
    46.         'filter_name_2' => 'Обмотка',
    47.         'filter_name_3' => 'Вольтаж',
    48.         'filter_content_1' => '25 VA(Вт)',
    49.         'filter_content_2' => 'медь',
    50.         'filter_content_3' => '12/24/36v'
    51.     ],
    52.     [
    53.         'filter_name_1' => 'Мощность',
    54.         'filter_name_2' => 'Обмотка',
    55.         'filter_name_3' => 'Вольтаж',
    56.         'filter_content_1' => '25 VA(Вт)',
    57.         'filter_content_2' => 'медь',
    58.         'filter_content_3' => '12/24/36v'
    59.     ],
    60.     [
    61.         'filter_name_1' => 'Мощность',
    62.         'filter_name_2' => 'Обмотка',
    63.         'filter_name_3' => 'Вольтаж',
    64.         'filter_content_1' => '25 VA(Вт)',
    65.         'filter_content_2' => 'медь',
    66.         'filter_content_3' => '12/24/36v'
    67.     ],
    68.     [
    69.         'filter_name_1' => 'Мощность Ват',
    70.         'filter_name_2' => 'Материал обмотки',
    71.         'filter_name_3' => 'Сила тока',
    72.         'filter_content_1' => '25 VA(Вт)',
    73.         'filter_content_2' => 'медь',
    74.         'filter_content_3' => '16/28/36v'
    75.     ]
    76.  
    77. ];
    78. $ar = prepareGetFilters($inputArr);
    79. echo '<pre>';
    80. print_r($ar);
    81. echo '</pre>';
     
    TeslaFeo нравится это.
  16. smartCreate

    smartCreate Новичок

    С нами с:
    4 ноя 2016
    Сообщения:
    122
    Симпатии:
    4
    Я повторюсь, о том что структурные данные очень плохие - я знаю. Но это просто факт с которым я не могу нечего поделать.

    На счет вот этого:
    Это интернет магазин силового оборудования (трансформаторы, РУ и т.д.), есть группа например Асинхронные двигатели. А они разделяются дополнительно на двигатели с короткозамкнутым ротором, и фазным ротором. Если двигатель с КЗ ротором то он характеризуется по Силе тока, а если с фазным то по Вольтажу. Вот так они и оказались в одной графе.

    @askanim, я не совсем понял вот это:
    и вот это:

    Это вопросы ко мне или вы обращались к другим собеседниками ?)
     
  17. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Берёшь все свои массивы собераешь в один и кладёшь в функцию prepareGetFilters($inputArr) и будет тебе счастье
    --- Добавлено ---
    к другим я сделал то что ты хотел всё работает как ты и написал в тс :)
    --- Добавлено ---
    Но это конечно жесть что там происходит но по другому я не знаю как.
    --- Добавлено ---
    только добавился ещё ключ один uniq но от него нельзя избавиться это ключевое слово связывает массивы чтобы они не повторялись.
     
  18. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    а их всегда 4??
     
  19. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @TeslaFeo будет больше изменит.
    --- Добавлено ---
    не думаю что это проблема настоящая
     
  20. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    по одному можно в цикле))
     
  21. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    пусть будет вот так ($i=1;$i<999999999999;$i++) или вот так $i==true, всё равно выход там предусмотрен. в чём проблема не вижу проблемы
     
  22. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    их может быть неизвестное количество))
    на это и был расчет, когда я писал while(true)
     
  23. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @TeslaFeo нет цикл уже в моей второй функции не надо экспериментировать.
    --- Добавлено ---
    @TeslaFeo пусть сделает вот так значит $i==true и будет счастье не вижу проблемы
    --- Добавлено ---
    самый геморой сейчас был дебаг циклов
    --- Добавлено ---
    @smartCreate куда ты там пропал всё получилось у тебя или нет?
     
  24. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    это монстр еще по хлеще, чем был)
    --- Добавлено ---
    [​IMG]
     
  25. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    А что он хотел он и одной строки хотел слепить многоуровневый массив. Я сделал ему. И он работает лучше не придумать. Функций у пыха для подобных ситуаций я не обнаружил. все функции по склейке здесь не подходят значит ток этот вариант
    --- Добавлено ---
    А взрыв к чему?