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

Я пытаюсь преобразовать сериализованную строку в массив

Это строка, которую я получаю на php (форма, отправленная с использованием сериализованного AJAX POST)

"ref_1=000CBA0000&name_1=Produto%20A&quantity_1=1&ref_2=000CBA0000&name_2=Produto%20A&quantity_2=1&ref_3=000CBA0000&name_3=Produto%20A&quantity_3=1"

каждый продукт, который входит в строку, имеет свою собственную ссылку, имя, количество, поэтому в настоящее время моя строка содержит информацию о 3 продуктах, она может меняться при каждом запросе.

Я пытаюсь преобразовать сериализованную строку в массив с этим форматом

[
    [1]
        ref => <copy the value from ref_1>
        name => <copy the value from name_1>
        quantity => <copy the value from quantity_1>
    [2]
        ref => <copy the value from ref_2>
        name => <copy the value from name_2>
        quantity => <copy the value from quantity_2>

    [3] 
        ref => <copy the value from ref_3>
        name => <copy the value from name_3>
        quantity => <copy the value from quantity_3>
]

Так что позже я могу сделать продукт для каждого и получить их по отдельности.

я попытался взорвать строку с помощью:

$array = explode("&",$string);
var_dump($array);

но это дает мне другой результат:

array(9) { [0]=> string(16) "ref_1=000CBA0000" [1]=> string(21) "name_1=Produto%20A" [2]=> string(12) "quantity_1=1" [3]=> string(16) "ref_2=000CBA0000" [4]=> string(21) "name_2=Produto%20A" [5]=> string(12) "quantity_2=1" [6]=> string(16) "ref_3=000CBA0000" [7]=> string(21) "name_3=Produto%20A" [8]=> string(12) "quantity_3=1" }

Что вы сделали до сих пор?

Cid 02.07.2019 17:45

Это похоже на URL-адрес GET. Откуда эта строка? Вам не нужен параметр name?

Andreas 02.07.2019 17:48

ajax serialize(), отправленный через POST, извините, в нем был продукт, но его имя исправлено. Спасибо за предупреждение.

Artur Mendes 02.07.2019 17:49
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
3
34
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать parse_str() для синтаксического анализа параметров, затем зациклиться на массиве и explode() для ключа, чтобы получить имя ключа и номер ключа отдельно.

parse_str("ref_1=000CBA0000&name_1=Produto%20A&quantity_1=1&ref_2=000CBA0000&name_2=Produto%20A&quantity_2=1&ref_3=000CBA0000&name_3=Produto%20A&quantity_3=1", $arr);


foreach($arr as $key => $val){
    $temp = explode("_", $key);
    $new[$temp[1]][$temp[0]] = $val;
}
var_dump($new);

Дает:

array(3) {
  [1]=>
  array(3) {
    ["ref"]=>
    string(10) "000CBA0000"
    ["name"]=>
    string(9) "Produto A"
    ["quantity"]=>
    string(1) "1"
  }
  [2]=>
  array(3) {
    ["ref"]=>
    string(10) "000CBA0000"
    ["name"]=>
    string(9) "Produto A"
    ["quantity"]=>
    string(1) "1"
  }
  [3]=>
  array(3) {
    ["ref"]=>
    string(10) "000CBA0000"
    ["name"]=>
    string(9) "Produto A"
    ["quantity"]=>
    string(1) "1"
  }
}

https://3v4l.org/WVGiv

Как упоминает Сид, это будет работать до тех пор, пока в имени клавиш есть знак подчеркивания, разделяющий имя и число, именно в таком порядке. Если это не так, он потерпит неудачу.

собирался опубликовать тот же ответ, что и вы, быстрее :)

Cid 02.07.2019 17:58

Пока ответы публикуются в разумные сроки, меня это устраивает. Может быть, у вашего ответа есть лучшее объяснение

Andreas 02.07.2019 17:59

Слишком поздно я отказался от своего ответа, хе-хе. Я бы добавил, что это будет работать до тех пор, пока параметры URL-адреса все выглядят так something_number

Cid 02.07.2019 18:01

Это именно то, что мне было нужно! Спасибо! Отмечено!

Artur Mendes 02.07.2019 18:03

Вот код, который будет делать то, что вы просили, и независимо от того, сколько параметров (и в каком порядке) будет иметь ваша строка:

$string = "ref_1=000CBA0000&name_1=Produto%20A&quantity_1=1&ref_2=000CBA0000&name_2=Produto2%20A&quantity_2=2&ref_3=000CBA0000&name_3=Produt3o%20A&quantity_3=3";

parse_str($string, $paramsArray);

$result = [];

foreach ($paramsArray as $key => $item) {
    if (strpos($key, 'ref_') !== false) {
        $itemNumber = substr($key, strpos($key, "ref_") - 1);
        $result[] = [
          'ref' => $key,
          'name' =>  $paramsArray['name_'.$itemNumber],
          'quantity' =>  $paramsArray['quantity_'.$itemNumber],
        ];

    }
}

в результате у вас будет необходимый формат:

[
    [1]
        ref => <copy the value from ref_1>
        name => <copy the value from name_1>
        quantity => <copy the value from quantity_1>
    [2]
        ref => <copy the value from ref_2>
        name => <copy the value from name_2>
        quantity => <copy the value from quantity_2>

    [3] 
        ref => <copy the value from ref_3>
        name => <copy the value from name_3>
        quantity => <copy the value from quantity_3>
]

Другие вопросы по теме

Похожие вопросы