2009-10-20 11 views
5

Ich brauche die Bestandswerte aus dieser Reihe zu bekommen:Pattern Match auf einem Array Keys

Array ( 
[stock0] => 1 
[stockdate0] => 
[stock1] => 3 
[stockdate1] => apple 
[stock2] => 2 [ 
stockdate2] => 
) 

ich brauche Match Muster auf diesem Array, in dem der Array key = "Lager" + 1 Platzhalter-Zeichen. Ich habe versucht, die Array-Filter-Funktion zu verwenden, um jeden anderen Wert auf das PHP-Handbuch zu bekommen, aber die leeren Werte scheinen es zu verwerfen. Ich habe viele verschiedene Dinge ausprobiert, aber nichts funktioniert.

Kann dies getan werden?

+0

Können wir die Funktion, die Sie vorbei array_filter sehen? –

+0

Was genau versuchen Sie zu erreichen? – Gumbo

+0

@ Jeff Ober Funktion selbst ($ var) { return (($ var & 1)); !} print_r (array_filter ($ Lager, "even")); @ Gumbo ich ein Formular bin verarbeitend passieren . die Variablen in einer Datenbank Dieser Teil ist für Variationen Farbe Bestandskontrolle Einstellung es wie folgt gespeichert:. rot | blau | Grün 1 | 2 | 3 || Februar 2010 Die zweite Zeile läuft 3 if-Anweisungen, die die entsprechende Nachricht anzeigen (wenn Nummer 3 das Datum enthält) So dass, wenn diese Browser-Seite angezeigt wird, ich einfach die Arrays durch Explodieren der Trennzeichen erhalten kann. – Oliver

Antwort

2

array_filter hat keinen Zugriff auf den Schlüssel und damit ist nicht das richtige Werkzeug für den Job.

Ich glaube, was Sie suchen, dies zu tun ist:

$stocks = Array ( 
"stock0" => 1, 
"stockdate0" => '', 
"stock1" => 3, 
"stockdate1" => 'apple', 
"stock2" => 2, 
"stockdate2" => '' 
); 


$stockList = array(); //Your list of "stocks" indexed by the number found at the end of "stock" 

foreach ($stocks as $stockKey => $stock) 
{ 
    sscanf($stockKey,"stock%d", &stockId); // scan into a formatted string and return values passed by reference 
    if ($stockId !== false) 
    $stockList[$stockId] = $stock; 
} 

Jetzt $ LAGER wie folgt aussieht:

Array ( 
[0] => 1 
[1] => 3 
[2] => 2 
) 

Sie können mit ihm ein wenig Aufhebens brauchen, aber ich denke, das ist, was du verlangst.

JEDOCH sollten Sie Jeff Obers Ratschlag unbedingt befolgen, wenn Sie die Möglichkeit dazu haben.

+0

Das sieht gut aus. jedoch
Im Moment ist es Rückkehr
[0] => ''
[1] => Apfel
[2] => ''

IE die stockdate statt der Aktienwert
Ich denke, Ich kann es anpassen - helfen Sie mir auch dabei! – Oliver

+0

Ich habe gerade versucht, "stock% d" (falsche Werte) auf "stockdate% d" umzuschalten, was mir die Werte gab: [] => 1 [0] => 2 [1] => 3 [2] => '' . Weißt du wie man die Schlüssel aufrichtet? – Oliver

4
<?php 

$foo = 
array ( 
'stock0' => 1, 
'stockdate0' => 1, 
'stock1' => 3, 
'stockdate1' => 2, 
); 

$keys = array_keys($foo); 
foreach ($keys as $key) { 
    if (preg_match('/stock.$/', $key)) { 
    var_dump($key); 
    } 
} 

Ich hoffe, ich interpretierte korrekt und Sie wollten 'Stock', 1 Platzhalterzeichen, das ist kein Zeilenumbruch, dann Ende der Zeichenfolge.

+1

Das sieht wie die direkte Antwort auf die Frage des OP aus.Ich würde http://www.refactoring.com/catalog/inlineTemp.html auf diese Lösung anwenden, um die Temp-Variablen $ keys loszuwerden. –

+1

Ich habe die temporäre Variable nur aus irgendeinem Grund verlassen, weil er sie wieder benutzen wollte, und normalerweise ist es einfacher für Neulinge zu greifen, je mehr Variablen man macht, anstatt die Ausdrücke schwerer zu fassen zu machen. –

+0

Ich bin ein großer Fan von RegEx und das könnte sicherlich so gemacht werden. – ChronoFish

4

Sie speichern sollten diejenigen, die als:

Array(
    [0] => Array(
    stock => 1, 
    stockdate => ... 
), 
    [1] => Array(
    stock => 3, 
    stockdate => apple 
), 
    ... 
) 
+1

Ich bekomme das tatsächlich von einem $ _POST-Array. Ich habe nicht viel Auswahl. – Oliver

0

Ok Arbeitslösung: Grün für ChronoFish!

$stockList = array(); //Your list of "stocks" indexed by the number found at the end of "stock" 

foreach ($stock as $stockKey => $stock) 
{ 
    sscanf($stockKey,"message%d", $stockId); // scan into a formatted string and return values passed by reference 
    if ($stockId !== false) { 
    $stockList[$stockId] = $stock; 
} 

$stockList=array_values($stockList); //straightens array keys out 
$stockList = array_slice ($stockList, "0", $count); //gets rid of blank value generated at end of array (where $count = the array's orginal length) 
print_r ($stockList); 
1
# returns array('stock1' => 'foo') 
array_flip(preg_grep('#^stock.$#', array_flip(array('stock1' => 'foo', 'stockdate' => 'bar')))) 

nicht sicher, wie gut die Leistung der Regex zurückzuführen ist und zwei Flips, aber ausgezeichnete Wartbarkeit (keine Fehlersuche in Schleifen).

1

Seit PHP 5.6.0 wurde die flag Option zu array_filter hinzugefügt. Auf diese Weise können Sie auf der Grundlage der Array-Schlüssel filtern, anstatt ihre Werte:

array_filter($items, function ($key) { 
    return preg_match('/^stock\d$/', $key); 
}, ARRAY_FILTER_USE_KEY); 
Verwandte Themen