У меня есть запрос POST на одну из моих страниц, вот небольшой сегмент:
[shipCountry] => United States [status] => Accepted [sku1] => test [product1] => Test Product [quantity1] => 1 [price1] => 0.00
Этот запрос может быть любого размера, и каждый ключ имени и количества продуктов будет отображаться как «productN» и «quantityN», где N является целым числом, начиная с 1.
Я хотел бы иметь возможность подсчитать, сколько уникальных ключей соответствует указанному выше формату, что даст мне подсчет количества заказов (число, которое явно не указано в запросе).
Каков наилучший способ сделать это в PHP?
Ну, если вы знаете, что каждый продукт будет иметь соответствующий массив ключей, соответствующий «productN», вы можете сделать это:
$productKeyCount = count(preg_grep("/^product(\d)+$/",array_keys($_POST)));
preg_grep () хорошо работает на массивах для такого рода вещей.
Что означало Gumbo с его комментарием «use array», это следующее:
В вашей HTML-форме используйте это:
<input type="text" name="quantity[]" />
и $_POST['quantity']
будет массивом всех, содержащих все ваши количества.
Если вам нужно указать идентификатор, вы также можете это сделать:
<input type="text" name="quantity[0]" />
$_POST['quantity][0]
будет удерживать соответствующее количество.
Как упоминалось в gumbo, вы можете группировать все параметры, описывающие один элемент в своем собственном массиве, что обычно упрощает их итерацию. Возможно, у вас нет контроля над параметрами POST, но вы можете их реструктурировать, например, с помощью
<?php $testdata = array( 'shipCountry' => 'United States', 'status' => 'Accepted', 'sku1' => 'test1', 'product1' => 'Test Product1', 'quantity1' => '1', 'price1' => '0.01', 'sku2' => 'test2', 'product2' => 'Test Product2', 'quantity2' => '2', 'price2' => '0.02' ); $pattern = '/^(.*\D)(\d+)$/'; $foo = array('items'=>array()); foreach($testdata as $k=>$v) { if ( preg_match($pattern, $k, $m) ) { $foo['items'][$m[2]][$m[1]] = $v; } else { $foo[$k] = $v; } } print_r($foo);
Хотя есть много примеров, если вам гарантировано, что числа должны быть смежными, я обычно придерживаюсь подхода:
<?php $i = 1; while( isset($_POST['product'.$i) ) { // do something $i++; }