计数相似的数组键

时间:2009-08-26 21:36:53

标签: php arrays post

我有一个POST请求来到我的一个页面,这里有一小部分:

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

此请求可以是任意大小,每个产品名称和数量的密钥都会被称为“productN”和“quantityN”,其中N是一个整数,从1开始。

我希望能够计算出与上述格式匹配的唯一密钥数量,这可以计算出订购了多少产品(请求中未明确给出的数字)。

在PHP中执行此操作的最佳方法是什么?

4 个答案:

答案 0 :(得分:8)

好吧,如果你知道每个产品都有一个匹配“productN”的相应数组键,你可以这样做:

$productKeyCount = count(preg_grep("/^product(\d)+$/",array_keys($_POST)));
对于那种事情,

preg_grep()适用于数组。

答案 1 :(得分:1)

Gumbo对他的“使用数组而不是”评论意味着以下内容:

在您的HTML表单中使用:

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

然后$_POST['quantity']将是包含所有数量的所有数组。

如果您需要提供身份证,您也可以这样做:

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

$_POST['quantity][0]将保留相应的数量。

答案 2 :(得分: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); 

答案 3 :(得分:0)

虽然有很多例子,如果你保证这些数字应该是连续的,我通常采用这种方法:

<?php 
$i = 1; 
while( isset($_POST['product'.$i) )
{
    // do something
    $i++;
}