Подсчет похожих ключей массива - PullRequest
4 голосов
/ 27 августа 2009

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

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

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

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

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

Ответы [ 4 ]

8 голосов
/ 27 августа 2009

Что ж, если вы знаете, что каждому продукту соответствует ключ массива, соответствующий «productN», вы можете сделать это:

$productKeyCount = count(preg_grep("/^product(\d)+$/",array_keys($_POST)));

preg_grep () хорошо работает на массивах для подобных вещей.

1 голос
/ 27 августа 2009

Что имел в виду Гамбо со своим комментарием «вместо него использовать массив», это:

В вашей HTML-форме используйте это:

<input type="text" name="quantity[]" />

и $_POST['quantity'] будут массивом всех ваших количеств.

Если вам нужно указать идентификатор, вы также можете сделать это:

<input type="text" name="quantity[0]" />

$_POST['quantity][0] будет содержать соответствующее количество.

0 голосов
/ 27 августа 2009

Хотя существует множество примеров, если вы уверены, что числа должны быть смежными, я обычно принимаю подход:

<?php 
$i = 1; 
while( isset($_POST['product'.$i) )
{
    // do something
    $i++;
}
0 голосов
/ 27 августа 2009

Как упомянул 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); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...