20

重複の可能性:
配列キーのパターン マッチ

特定のキー パターンを持つ配列内のすべての要素を取得する必要があります。たとえば、この配列では次のようになります。

$items = array(
   "a"         => "1",
   "b"         => "2",
   "special_1" => "3",
   "c"         => "4",
   "special_2" => "5",
   "special_3" => "6",
   "d"         => "7"
);

string を含むキーを持つすべての要素が必要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 に答える