Мне нужно получить значения запаса из этого массива:
Array ( [stock0] => 1 [stockdate0] => [stock1] => 3 [stockdate1] => apple [stock2] => 2 [ stockdate2] => )
Мне нужно сопоставить шаблон по этому массиву, где ключ массива = «запас» + 1 символ подстановки. Я попытался использовать функцию фильтра массива, чтобы получить любое другое значение в руководстве PHP, но пустые значения, похоже, выкидывают его. Я много раз пробовал разные вещи, но ничего не работало.
Это можно сделать?
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);