我需要使用特定的键模式获取数组中的所有元素。例如,在这个数组中:
$items = array(
"a" => "1",
"b" => "2",
"special_1" => "3",
"c" => "4",
"special_2" => "5",
"special_3" => "6",
"d" => "7"
);
我需要所有带有包含字符串special_
的键的元素。这些应该定义一个新数组:
$special_items = array(
"special_1" => "3",
"special_2" => "5",
"special_3" => "6",
);
除while
循环外还有智能方法吗?
答案 0 :(得分:21)
这个怎么样?
$special_items = array();
foreach($items as $key => $val) {
if(substr($key, 0, 8) == 'special_')
$special_items[$key] = $val;
}
答案 1 :(得分:6)
首先,您需要获取包含密钥的数组。 array_keys
然后,您需要过滤键以找到您想要的键。 array_filter
使用此回调:
function($a) {return substr($a,0,8) == "special_";}
然后翻转数组,使键再次成为键而不是值。 array_flip
最后,将这些键与原始数组相交。 array_intersect_key
结果:
$special_items = array_intersect_key($items,array_flip(array_filter(array_keys($items),function($a) {return substr($a,0,8) == "special_";})));
答案 2 :(得分:4)
您可以使用FilterIterator
$iterator = new SpecialFilter($items, 'special');
var_dump(iterator_to_array($iterator));
输出
array
'special_1' => string '3' (length=1)
'special_2' => string '5' (length=1)
'special_3' => string '6' (length=1)
使用的课程
class SpecialFilter extends FilterIterator {
private $f;
public function __construct(array $items, $filter) {
$object = new ArrayObject( $items );
$this->f = $filter;
parent::__construct( $object->getIterator() );
}
public function accept() {
return 0 === strpos( $this->getInnerIterator()->key(), $this->f );
}
}
答案 3 :(得分:2)
$special_items = array_intersect_key(array_flip(preg_grep('/^special_\d+/', array_keys($items))), $items);
请不要实际使用它。只需使用带有strpos + fore语句的foreach循环,就像普通人一样。
答案 4 :(得分:1)
怎么样
$keys = preg_grep( "/special_/i", array_keys( $items ) );
$new_array = array();
foreach( $keys as $k )
{
$new_array[ $k ] = $items[ $k ];
}