Обработка $_POST

По методу POST приходит такой массив:

Array
(
[product_name_1] => Smart Watch
[product_price_1] => 29.99
[quantity_1] => 1
[product_total_1] => 29.99
[product_name_3] => Headphones
[product_price_3] => 19.99
[quantity_3] => 1
[product_total_3] => 19.99
)

нужно его обработать таким образом, чтобы на выходе образовалось 2 таких массива:

 $invoiceData['items'][] = array( 'Smart Watch','29.99','1','29.9');
 $invoiceData['items'][] = array( 'Headphones','19.99','1','19.99');

вот код:

foreach($_POST as $key => $val) {

if (strpos($key, 'product_name') !== false ) {

    $invoiceData['items'][] = array( $val,'','','1');
    //array_push($invoiceData['items'][0],$val,'1','1','1');
}
if (strpos($key, 'product_price_') !== false ) {

}
if (strpos($key, 'quantity_') !== false ) {

}
if (strpos($key, 'product_total_') !== false ) {

}

}

тут он он записывает первое значение правильно, но как продолжить запись в этот же массив?т.е чтобы после каждой проверки он записывал соответствующее value ключа проверки в массив на следующее место. Чтобы в конце концов получилось $invoiceData['items'][] = array( $val, $val, $val, $val); где значения соответсвуют ключам проверки


Ответы (1 шт):

Автор решения: Node_pro

Попробуйте следующий код:

$res = [];
foreach($_POST as $k=>$v){
   if(!preg_match('#^(.+)_([0-9]+)$#', $k, $keyMatch)) continue;
   $res[$keyMatch[2]][$keyMatch[1]] = $v;
}

$res = array_map(function($item){
   return array_values($item);
}, $res);

$invoiceData['items'] = array_values($res);

Данный фрагмент кода позиционируется как пример. Кстати фрагменты, какие не соответствуют стандарту ( подчеркивания внизу и число на конец) будут игнорироваться

→ Ссылка