2009-10-20 4 views
5

мне нужно, чтобы получить значение запасов из этого массива:Pattern Match на массиве ключей

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

Мне нужно шаблон матча на этом массиве, где ключ массива = «акции» + 1 символ подстановку. Я попытался использовать функцию фильтра массива, чтобы получить любое другое значение в руководстве PHP, но пустые значения, похоже, выкидывают. Я много раз пробовал разные вещи, но ничего не работало.

Можно ли это сделать?

+0

Можем ли мы увидеть функцию, с которой вы проходите массив_filter? –

+0

Что именно вы пытаетесь достичь? – Gumbo

+0

@ Джефф Ober функция даже ($ Var) { возвращения (($ вар & 1)); !} print_r (array_filter ($ акции, "даже")); @ Gumbo Я обрабатывающий формой, чтобы пройти . переменные в базе данных Эта часть предназначена для установки управления запасами на цветовых вариациях Он хранится так:. красный | синий | Зеленый 1 | 2 | 3 || Feb 2010 Вторая линия проходит 3 если операторы, отображающие соответствующее сообщение (которое, если оно номер 3, будет использовать дату) Таким образом, когда это отображается на стороне браузера, я могу просто получить массивы, взорвав разделители. – Oliver

ответ

2

array_filter не имеет доступа к ключу и, следовательно, не является правильным инструментом для работы.

Я верю, что вы хотите сделать это:

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

Теперь $ Фондовый выглядит следующим образом:

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

Вам, возможно, придется возиться с ним немного, но я думаю, это то, о чем вы просите.

ОДНАКО, вы действительно должны следовать совету Джеффа Обера, если у вас есть возможность сделать это.

+0

Это выглядит хорошо.
На данный момент, однако это возвращение
[0] => ''
[1] => яблоко
[2] => ''

И.Е. stockdate вместо стоимость акций
Я думаю, Я могу настроить его - просто не стесняйтесь помогать мне в этом! – Oliver

+0

Я просто попытался переключить «запас% d» (неправильные значения) на «sharedate% d», который дал мне значения: [] => 1 [0] => 2 [1] => 3 [2] => '' , Вы знаете, как выпрямить ключи? – 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); 
    } 
} 

Я надеюсь, что я правильно интерпретированы и вы хотите «запас», 1 символ подстановки то не символ новой строки, то конец строки.

+1

Это похоже на прямой ответ на вопрос OP.Я бы применил http://www.refactoring.com/catalog/inlineTemp.html к этому решению, чтобы избавиться от переменной temp переменной $. –

+1

Я только оставил временную переменную по какой-либо причине, по которой он хотел использовать их снова, и, как правило, легче понять для новичков больше переменных, которые вы делаете, вместо того, чтобы сделать выражения сложнее понять. –

+0

Я большой поклонник RegEx, и это, безусловно, можно было бы сделать таким образом. – ChronoFish

4

Вы должны хранить их как:

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

Я получаю это от массива $ _POST. Кажется, у меня нет большого выбора. – Oliver

0

ОК рабочее решение: Зеленый для 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')))) 

Не уверен, насколько хорошо производительность за счет регулярных выражений и двух перестроек, но отличную ремонтопригодность (не ошибка охоты в петлях).

1

С PHP 5.6.0 опция flag была добавлена ​​к array_filter. Это позволяет фильтровать на основе ключей массива, а не его значений:

array_filter($items, function ($key) { 
    return preg_match('/^stock\d$/', $key); 
}, ARRAY_FILTER_USE_KEY); 
Смежные вопросы