2009-08-26 11 views
4

j'ai une requête POST à ​​venir à un de mes pages, voici un petit segment:Count multidisque similaires clés

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

Cette demande peut être de toute taille, et chaque nom et la clé de la quantité des produits rencontrais que "productN" et "quantityN", où N est un nombre entier, commençant par 1.

J'aimerais pouvoir compter combien de clés uniques correspondent au format ci-dessus, ce qui me donnerait un compte du nombre de produits commandé (un nombre qui n'est pas explicitement indiqué dans la requête).

Quelle est la meilleure façon de le faire en PHP?

+2

mieux les tableaux d'utilisation à la place: http: // docs. php.net/manual/en/faq.html.php#faq.html.arrays – Gumbo

+0

$ _POST est un tableau. De plus, je ne contrôle pas la façon dont les données sont diffusées. –

Répondre

8

Eh bien, si vous savez que chaque produit aura une correspondance clé du tableau correspondant « productN », vous pouvez le faire:

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

preg_grep() fonctionne bien sur les tableaux pour ce genre de chose.

+0

Et si je n'ai besoin que de ceux-ci avec de la valeur! = '' – Martin

1

Que Gumbo signifie son « utiliser le tableau au lieu » commentaire est le suivant:

Dans votre usage formulaire HTML ceci:

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

et $_POST['quantity'] sera alors un tableau de tous contenant tous vos quantités

Si vous devez fournir un identifiant, vous pouvez aussi le faire:

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

$_POST['quantity][0] détiendront alors la quantité correspondante.

0

Comme mentionné par gumbo, vous pouvez regrouper tous les paramètres décrivant un élément dans son propre tableau, ce qui rend généralement plus facile de les itérer. Vous ne pouvez pas contrôler les paramètres POST, mais vous pouvez les restructurer comme par exemple. avec

<?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); 
0

Bien qu'il ait beaucoup d'exemples, si vous êtes assuré que les chiffres devraient être contigus, je prends habituellement l'approche:

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