2009-08-26 20 views
4

Ich habe eine Anfrage POST zu einem meiner Seiten kommen, hier ist ein kleines Segment:Count ähnlicher Array Keys

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

Diese Anforderung beliebig groß sein kann, und jeder Produktname und Schlüssel der Menge würden rüberkommen "productN" und "quantityN", wobei N eine ganze Zahl ist, beginnend mit 1.

Ich möchte zählen können, wie viele eindeutige Schlüssel dem obigen Format entsprechen, was mir eine Zählung der Anzahl der Produkte geben würde geordnet (eine Zahl, die in der Anfrage nicht explizit angegeben ist).

Was ist der beste Weg, dies in PHP zu tun?

+2

Bessere Nutzung Arrays statt: http: // docs. php.net/manual/en/faq.html.php#faq.html.arrays – Gumbo

+0

$ _POST ist ein Array. Außerdem kontrolliere ich nicht, wie die Daten zustande kommen. –

Antwort

8

Nun, wenn Sie wissen, dass jedes Produkt einen entsprechenden Array-Schlüssel matching „productN“ haben, können Sie dies tun:

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

preg_grep() funktioniert gut auf Arrays für diese Art der Sache.

+0

was ist, wenn ich nur diese mit Wert brauche! = '' – Martin

1

Was Gumbo mit seinem "Einsatz Array statt" gemeint Kommentar ist folgende:

in Ihrem HTML-Formular verwenden diese:

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

und $_POST['quantity'] wird dann eine Reihe von all alle enthalten sein Ihre Mengen.

Wenn Sie eine ID versorgen möchten, können Sie dies auch:

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

$_POST['quantity][0] wird dann die entsprechende Menge halten.

0

Wie von Gumbo erwähnt, könnten Sie alle Parameter, die ein Element beschreiben, in einem eigenen Array gruppieren, was es normalerweise einfacher macht, sie zu iterieren. Sie haben möglicherweise keine Kontrolle über die POST-Parameter, aber Sie können sie wie z. mit

<?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

Zwar gibt es viele Beispiele, wenn Sie garantiert sind, dass die Zahlen fortlaufend sein sollte, nehme ich in der Regel den Ansatz:

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