За последние 24 часа нас посетили 36029 программистов и 1745 роботов. Сейчас ищут 1306 программистов ...

Преобразование строки в массив

Тема в разделе "PHP для новичков", создана пользователем Yankovitz, 11 янв 2018.

  1. Yankovitz

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

    С нами с:
    21 ноя 2014
    Сообщения:
    194
    Симпатии:
    6
    Есть строка:
    Код (Text):
    1. weight=230&weight=280&brend=Pluffies&price_ot=40&price_do=110
    На выходе должен получиться массив:
    Код (Text):
    1.  
    2.                 array(
    3.                     'key'    => 'weight',
    4.                     'value'  => array( '230', '280' )
    5.                 ),
    6.                 array(
    7.                     'key'    => 'brend',
    8.                     'value'  => array( 'Pluffies' )
    9.                 ),
    10.                 array(
    11.                     'key'    => 'price',
    12.                     'value'  => array( 40, 110 ),
    13.                     'type'   => 'numeric',
    14.                     'compare'=> 'BETWEEN'
    15.                 )
    16.            
    Подскажите направление...
     
  2. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    explode по &, затем каждый элемент полученного массива разбиваем на пары параметр,значение (можно тоже explode, но по '=') и попутно, или после - собираем результирующий массив.
     
  3. Yankovitz

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

    С нами с:
    21 ноя 2014
    Сообщения:
    194
    Симпатии:
    6
    Делаю так:
    Код (Text):
    1.         $vals = explode( '&', $str); // weight=230&weight=280&brend=Pluffies&size=11
    2.         $array = [];
    3.         foreach ( $vals as $val ) {
    4.             $a = explode( '=', $val);
    5.             $arr = [];
    6.             $arr['key']   = $a[0];
    7.             $arr['value'] = $a[1];
    8.             $array = $arr;
    9.         }
    Только массив из последнего значения получается
    --- Добавлено ---
    Может есть вариант более короткой записи?
     
  4. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    В восьмой строчке забыли добавление в массив сделать.
    Ну и в резкльтирующем массиве ещё надо будет сделать объединение нескольких значений для одинаковых ключей.
    Может и есть. Только сначала может быть лучше все "на пальцах", по шагам сделать...
     
  5. Yankovitz

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

    С нами с:
    21 ноя 2014
    Сообщения:
    194
    Симпатии:
    6
    Последняя строка так должна быть:
    $array[] = $arr;
    --- Добавлено ---
    Получился массив:
    Код (Text):
    1. Array
    2. (
    3.     [0] => Array
    4.         (
    5.             [key] => weight
    6.             [value] => 270
    7.         )
    8.  
    9.     [1] => Array
    10.         (
    11.             [key] => weight
    12.             [value] => 280
    13.         )
    14.  
    15.     [2] => Array
    16.         (
    17.             [key] => brend
    18.             [value] => Pluffies
    19.         )
    20.  
    21.     [3] => Array
    22.         (
    23.             [key] => size
    24.             [value] => 11
    25.         )
    26.  
    27. )
    Каким образом объединить все value с ключом weight в 1 массив?
     
  6. karmay

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

    С нами с:
    9 ноя 2017
    Сообщения:
    180
    Симпатии:
    18
    Адрес:
    Н.Новгород
  7. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    @Yankovitz, например, таким:
    PHP:
    1. $str = "weight=230&weight=280&brend=Pluffies&price_ot=40&price_do=110";
    2. $vals = explode('&', $str); // weight=230&weight=280&brend=Pluffies&size=11
    3. $array = [];
    4. $arrkeys = [];
    5. $i = 0;
    6. foreach ($vals as $val) {
    7.     $a = explode('=', $val);
    8.     $key = empty($a[0]) ? 'undefined' : $a[0];
    9.     $value = isset($a[1]) ? $a[1] : null;
    10.     if(array_key_exists($key, $arrkeys)) {
    11.         $array[$arrkeys[$key]]['value'][] = $value;
    12.     } else {
    13.         $arrkeys[$key] = $i;
    14.         $array[$i++] = ['key' => $key,'value' => [$value]];
    15.     }
    16. }
    17. unset($arrkeys);
    --- Добавлено ---
    Откройте, пожалуйста, секрет использования этой конструкции для решения описанной ТС задачи...
     
  8. karmay

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

    С нами с:
    9 ноя 2017
    Сообщения:
    180
    Симпатии:
    18
    Адрес:
    Н.Новгород
    ой, сорян, я чет ляпнул не подумавши, там же в массив обратно надо, а я в переменные...
     
  9. Yankovitz

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

    С нами с:
    21 ноя 2014
    Сообщения:
    194
    Симпатии:
    6
    У меня форма на javascript отправляет такие данные
    --- Добавлено ---
    weigth - это чекбоксы в форме