仅获取具有某些键的数组元素

时间:2012-10-14 22:48:14

标签: php arrays

  

可能重复:
  Pattern Match on a Array Key

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

$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循环外还有智能方法吗?

5 个答案:

答案 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 ];
}