За последние 24 часа нас посетили 22914 программистов и 1225 роботов. Сейчас ищут 705 программистов ...

Как разбить массив на подмассивы

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

  1. wissem

    wissem Активный пользователь

    С нами с:
    7 авг 2017
    Сообщения:
    15
    Симпатии:
    1
    есть массив, к примеру
    Код (Text):
    1. [SUPPLIER(1)] => ........................
    2.     [SUPPLIER(2)] => ABCR
    3.     [SUPPLIER(3)] => 4-BROMO-N,N-DIMETHYLANILINE
    4.     [SUPPLIER(4)] => 586-77-6
    5.     [SUPPLIER(5)] => .
    6.     [SUPPLIER(6)] => PRODUCT LINK: http://www.abcr.de/shop/de/AB112143
    7.     [SUPPLIER(7)] => _F   AB112143            100 G          EUR      112.20  98%
    8.     [SUPPLIER(8)] => _F   AB112143            500 G          EUR      177.00  98%
    9.     [SUPPLIER(9)] => _B   AB112143              1 KG         EUR      266.50  98%
    10.     [SUPPLIER(10)] => ........................
    11.     [SUPPLIER(11)] => ACC
    12.     [SUPPLIER(12)] => 4-BROMO-N,N-DIMETHYLANILINE
    13.     [SUPPLIER(13)] => 586-77-6
    14.     [SUPPLIER(14)] => .
    15.     [SUPPLIER(15)] => PRODUCT LINK: http://www.acccorporation.com/products/HCH0023200
    16.     [SUPPLIER(16)] => _F   HCH0023200           10 G          USD      110.00
    17.     [SUPPLIER(17)] => _F   HCH0023200          100 G          USD     2261.60
    18.     [SUPPLIER(18)] => ........................
    19.     [SUPPLIER(19)] => ACCELA-CHINA
    20.     [SUPPLIER(20)] => 4-BROMO-N,N-DIMETHYLANILINE
    21.     [SUPPLIER(21)] => 586-77-6
    22.     [SUPPLIER(22)] => .
    23.     [SUPPLIER(23)] => GHS HAZARD PHRASE: H302+H312+H332;H315;H319
    24.     [SUPPLIER(24)] => GHS PICTOGRAM: EXCLAMATION MARK
    25.     [SUPPLIER(25)] => GHS PRECAUTIONARY STATEMENT: P280;P305+P351+P338
    26.     [SUPPLIER(26)] => GHS SIGNALWORD: WARNING
    27.     [SUPPLIER(27)] => PRODUCT LINK: http://en.shao-yuan.com/cn/productview_goodsid_30946_good+
    28.     [SUPPLIER(28)] => SDS LINK: http://en.shao-yuan.com/cn/msds/SY013736.pdf
    29.     [SUPPLIER(29)] => _F   SY013736            100 G          USD      117.65  97+%
    30.     [SUPPLIER(30)] => _F   SY013736            500 G          USD      176.47  97+%
    31.     [SUPPLIER(31)] => ........................
    32.     [SUPPLIER(32)] => ACCELACHEM
    33.     [SUPPLIER(33)] => 4-BROMO-N,N-DIMETHYLANILINE
    34.     [SUPPLIER(34)] => 586-77-6
    35.     [SUPPLIER(35)] => .
    36.     [SUPPLIER(36)] => GHS HAZARD PHRASE: H302+H312+H332;H315;H319
    37.     [SUPPLIER(37)] => GHS PICTOGRAM: EXCLAMATION MARK
    38.     [SUPPLIER(38)] => GHS PRECAUTIONARY STATEMENT: P280;P305+P351+P338
    39.     [SUPPLIER(39)] => GHS SIGNALWORD: WARNING
    40.     [SUPPLIER(40)] => PRODUCT LINK: http://www.accelachem.com/cn/productview_goodsid_30946_go+
    41.     [SUPPLIER(41)] => SDS LINK: http://www.accelachem.com/cn/msds/SY013736.pdf
    42.     [SUPPLIER(42)] => _F   SY013736            100 G          USD      100.00  97+%
    43.     [SUPPLIER(43)] => _F   SY013736            500 G          USD      150.00  97+%
    44.     [SUPPLIER(44)] => ........................
    как разбить его на подмассивы по разделителю содержащему "......................."? Тоесть получить несколько массивов из элементов находящихся между "........................"
     
  2. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    PHP:
    1. // $arrayInput - входящий массив
    2.  
    3. $arrayResult = []; // сюда засунем готовый массив
    4. $delemiter = '........................'; // это разделитель
    5. $i = 0; // это счетчик наших массивов
    6.  
    7. foreach($arrayInput as $key => $val){
    8.   if ( $val == $delemiter ) {
    9.   $i++;
    10.   } else {
    11.   $arrayResult[$i][$key];
    12.   }
    13. } // на выходе получим удобный двумерный массив
     
    wissem нравится это.
  3. wissem

    wissem Активный пользователь

    С нами с:
    7 авг 2017
    Сообщения:
    15
    Симпатии:
    1
    А вы пробовали сами это решение? :)
     
  4. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    написал с ходу. Идея должна быть ясна. Кода мало и всё наглядно.
    При необходимости - можно модифицировать.
    А в чем проблема?
     
    wissem нравится это.
  5. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Я когда такие гаражи вижу, офигеваю почуть. Сериализацию изобрели тыщщу лет как. Ну нафига...
    А ты забыл в новый массив писать данные :) Вглядись в 11 строку внимательнее. В остальном алгоритм рабочий.
     
    TeslaFeo и wissem нравится это.
  6. wissem

    wissem Активный пользователь

    С нами с:
    7 авг 2017
    Сообщения:
    15
    Симпатии:
    1
    Спасибо огромное всем!
    Код (Text):
    1. $arrayResult = []; // сюда засунем готовый массив
    2. $delemiter = '........................'; // это разделитель
    3. $i = 0; // это счетчик наших массивов
    4. foreach($arrayInput as $key => $val){
    5.   if ( $val == $delemiter ) {
    6.   $i++;
    7.   } else {
    8.   $arrayResult[$i][$key] = $val;
    9.   }
    10. } // на выходе получим удобный двумерный массив
     
    TeslaFeo нравится это.
  7. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    :) да есть косяк)) сорян))
     
  8. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Дело житейское.
     
  9. wissem

    wissem Активный пользователь

    С нами с:
    7 авг 2017
    Сообщения:
    15
    Симпатии:
    1
    Можно поподробнее) Не совсем понятно :)
     
  10. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Ну а что непонятного?
    Сериализация - это способ хранения структурированных данных в виде последовательности байтов, чаще текста, вне приложения. Чтобы потом можно было эти данные особым образом прочитать и получить структуру для использования в программе.

    Есть много способов сериализации. Сегодня самый распространенный, пожалуй, это JSON. Поддерживается PHP нативно уже хз сколько лет. При том, что в PHP есть и своя собственная сериализация. И вот в свете того, что можно что угодно хранить в JSON, пакуя и распаковывая одной строчкой, меня удивляют люди, приходящие на форум с очередной костыльной-велосипедной сериализацией, об которую ломаются ноги, с просьбой "помогите прочитать, превратив этот треш во что-то пригодное к работе".

    И то звездочками разделяют, то процентиками, то еще какой синтаксис выдумывают хитровыбоенный. Вместо того, чтобы просто сделать json_encode/json_decode.
     
    wissem нравится это.
  11. wissem

    wissem Активный пользователь

    С нами с:
    7 авг 2017
    Сообщения:
    15
    Симпатии:
    1
    а можно коротенький пример как в моем случае реализовать через сериализацию? не могу уложить в голове то, то прочитал про сериализацию и то, что вижу у себя на экране)
     
  12. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    То, что у вас на экране, если сгенерировано не вами, уже никак не исправить, оно изначально сериализовано на через самодельные костыли и лечению не поддается. Если же это было сделано вами, то надежда есть.

    Вот глядите. Вам выше код дали, который этот ужас читает в массив, так? А теперь сделайте так:
    PHP:
    1. var_dump(json_encode($arrayResult));
    И посмотрите, что оно выдало. Текст с фигурными скобками и двоеточиями - это наш json. Текстовое представление массива. Вы можете сохранить его отдельно и потом прочитать вообще в любой среде, которая умеет работать с json-форматом. Вы можете передать этот json на клиент и там превратить в структуру данных. То есть, по факту, вы можете переносить структуру данных между приложениями, и быть уверенным, что она будет выглядеть везде одинаково. Это вот прелести стандартизации.

    В PHP, чтобы эта строка снова стала массивом, нужно исполнить с ней
    PHP:
    1. json_decode($json_string, true);
    Если второй параметр (true) не передать, или передать false, то функция вернет не массив, а объект. Тут сами решайте, что вам нужно конкретно. Попробуйте сделать var_dump и для этого случая. Увидите уже не строку текста, а вполне себе php-массив/объект.

    Вывод - если хотите красиво и без головной боли десериализовывать данные, храните их изначально правильно сериализованными.
     
    wissem нравится это.