Сопоставление шаблонов по типу массива

Мне нужно получить значения запаса из этого массива:

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

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

Это можно сделать?

Solutions Collecting From Web of "Сопоставление шаблонов по типу массива"

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

Теперь $ stockList выглядит так:

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

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

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

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

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

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

 Array( [0] => Array( stock => 1, stockdate => ... ), [1] => Array( stock => 3, stockdate => apple ), ... ) 
 # returns array('stock1' => 'foo') array_flip(preg_grep('#^stock.$#', array_flip(array('stock1' => 'foo', 'stockdate' => 'bar')))) 

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

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

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

Хорошо работающее решение: зеленый для 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);