2009-10-20 12 views
5

muszę uzyskać wartości seryjnych z tej tablicy:Wzór Mecz na tablicy Key

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

muszę wzór spotkanie na tej tablicy, gdzie klucz array = „zapasów” + 1 wieloznacznym. Próbowałem użyć funkcji filtru tablicowego, aby uzyskać wszystkie inne wartości w podręczniku PHP, ale puste wartości wydają się być wyrzucane. Próbowałem wielu różnych rzeczy, które znalazłem, ale nic nie działa.

Czy to można zrobić?

+0

Czy widzimy funkcję przechodzącą przez filter_filter? –

+0

Co dokładnie próbujesz osiągnąć? – Gumbo

+0

@ Jeff Ober nawet funkcja ($ zmienna) { powrotny (($ var & 1)); !} print_r (array_filter ($ Grafika "nawet")); @ Gumbo mam PRZETWARZANIE formularz aby przekazać . zmienne do bazy ta część jest do ustawienia kontroli zapasów w wariantach kolorystycznych jest przechowywany tak:. czerwony | blue | Zielona 1 | 2 | 3 || lut 2010 druga linia biegnie 3 jeśli instrukcje, które wyświetlają odpowiednią wiadomość (która, jeśli jest to cyfra 3, będą zawierały datę) Tak więc, gdy wyświetlana jest strona przeglądarki, mogę po prostu pobrać tablice, eksplodując ograniczniki. – Oliver

Odpowiedz

2

array_filter nie ma dostępu do klucza, a zatem nie jest odpowiednim narzędziem do pracy.

Wierzę, czego szukasz zrobić to w ten sposób:

$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; 
} 

Teraz $ pień lista wygląda następująco:

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

może trzeba zamieszanie z nim trochę, ale myślę, o to prosisz.

JEDNAKĄ, naprawdę powinieneś postępować zgodnie z radą Jeffa Ober'a, jeśli masz taką możliwość.

+0

To wygląda dobrze.
Na razie jednak to powracającego
[0] => ''
[1] => jabłko
[2] => ''

czyli stockdate zamiast wartości zapasów
myślę Mogę to zmienić - po prostu pomóż mi z tym również! – Oliver

+0

Właśnie próbowałem przełączać "stock% d" (nieprawidłowe wartości) na "stockdate% d", co dało mi wartości: [] => 1 [0] => 2 [1] => 3 [2] => '' . Czy wiesz, jak wyprostować klucze? – 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); 
    } 
} 

Mam nadzieję, że prawidłowo interpretować i chciałeś „akcji”, 1 wieloznaczny nie ów nowej linii, a następnie zakończyć sznurka.

+1

To wygląda na prostą odpowiedź na pytanie OP.Chciałbym zastosować do tego rozwiązania metodę http://www.refactoring.com/catalog/inlineTemp.html, aby pozbyć się zmiennej temp $ keys. –

+1

Zostawiłem tylko zmienną tymczasową z jakiegokolwiek powodu, dla którego chciałbym ich użyć ponownie, i zazwyczaj łatwiej jest pojąć początkujących, im więcej zmiennych zrobisz, zamiast sprawić, że wyrażenia będą trudniejsze do uchwycenia. –

+0

Jestem wielkim fanem RegEx i to z pewnością można zrobić w ten sposób. – ChronoFish

4

Należy przechowywać je jako:

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

Tak naprawdę otrzymuję to z tablicy $ _POST. Nie wydaje mi się, żeby miał duży wybór. – Oliver

0

Dobrze działające rozwiązanie: Zielony dla 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')))) 

Nie wiem, jak dobre wykonanie jest spowodowane regex i dwa koziołki, ale doskonałe konserwacji (bez polowania błąd w pętli).

1

Od wersji PHP 5.6.0 do array_filter dodano opcję flag. To pozwala na filtrowanie w oparciu o klucze tablicy, a nie jej wartości:

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