20

可能重复:
数组键上的模式匹配

我需要获取具有特定键模式的数组中的所有元素。例如在这个数组中:

$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除了循环,还有什么聪明的方法吗?

4

5 回答 5

24

这个怎么样?

$special_items = array();

foreach($items as $key => $val) {
    if(substr($key, 0, 8) == 'special_')
        $special_items[$key] = $val;
}
于 2012-10-14T22:54:36.627 回答
7

首先,您需要获取一个包含键的数组。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_";})));
于 2012-10-14T22:56:41.797 回答
5

您可以使用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 );
    }
}
于 2012-10-14T22:58:19.413 回答
1
$special_items = array_intersect_key(array_flip(preg_grep('/^special_\d+/', array_keys($items))), $items);

请不要实际使用它。只需像所有普通人一样使用带有 strpos + if 语句的 foreach 循环。

于 2012-10-14T22:53:58.893 回答
1

怎么样

$keys = preg_grep( "/special_/i", array_keys( $items ) );

$new_array = array();

foreach( $keys as $k )
{
    $new_array[ $k ] = $items[ $k ];
}
于 2012-10-14T22:56:25.147 回答