Подсчет похожих ключей массива

У меня есть запрос POST на одну из моих страниц, вот небольшой сегмент:

[shipCountry] => United States [status] => Accepted [sku1] => test [product1] => Test Product [quantity1] => 1 [price1] => 0.00 

Этот запрос может быть любого размера, и каждый ключ имени и количества продуктов будет отображаться как «productN» и «quantityN», где N является целым числом, начиная с 1.

Я хотел бы иметь возможность подсчитать, сколько уникальных ключей соответствует указанному выше формату, что даст мне подсчет количества заказов (число, которое явно не указано в запросе).

Каков наилучший способ сделать это в PHP?

Solutions Collecting From Web of "Подсчет похожих ключей массива"

Ну, если вы знаете, что каждый продукт будет иметь соответствующий массив ключей, соответствующий «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++; }