Я пытаюсь преобразовать сериализованную строку в массив
Это строка, которую я получаю на 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" }
Это похоже на URL-адрес GET. Откуда эта строка? Вам не нужен параметр name?
ajax serialize(), отправленный через POST, извините, в нем был продукт, но его имя исправлено. Спасибо за предупреждение.






Вы можете использовать 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"
}
}
Как упоминает Сид, это будет работать до тех пор, пока в имени клавиш есть знак подчеркивания, разделяющий имя и число, именно в таком порядке. Если это не так, он потерпит неудачу.
собирался опубликовать тот же ответ, что и вы, быстрее :)
Пока ответы публикуются в разумные сроки, меня это устраивает. Может быть, у вашего ответа есть лучшее объяснение
Слишком поздно я отказался от своего ответа, хе-хе. Я бы добавил, что это будет работать до тех пор, пока параметры URL-адреса все выглядят так something_number
Это именно то, что мне было нужно! Спасибо! Отмечено!
Вот код, который будет делать то, что вы просили, и независимо от того, сколько параметров (и в каком порядке) будет иметь ваша строка:
$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>
]
Что вы сделали до сих пор?