2

次の形式 (flickr EXIF データ) のかなり大きな多次元配列がある場合。

array(
(int) 81 => array(
    'tagspace' => 'Nikon',
    'tagspaceid' => (int) 0,
    'tag' => 'ISOExpansion2',
    'label' => 'ISOExpansion2',
    'raw' => 'Off'
),
(int) 82 => array(
    'tagspace' => 'Nikon',
    'tagspaceid' => (int) 0,
    'tag' => 'LensType',
    'label' => 'Lens Type',
    'raw' => 'G'
),
(int) 83 => array(
    'tagspace' => 'Nikon',
    'tagspaceid' => (int) 0,
    'tag' => 'Lens',
    'label' => 'Lens',
    'raw' => '11-16mm f/2.8'
),...
)

特定の値を持つ配列を抽出する高速で効率的な方法はありますか。つまり、キー「Tag」の値「Lens」を探し、配列を戻り値として取得します。

array(
    'tagspace' => 'Nikon',
    'tagspaceid' => (int) 0,
    'tag' => 'Lens',
    'label' => 'Lens',
    'raw' => '11-16mm f/2.8'
)

また、これは Set を使用して行うことができますか? を使用して、次のことのみを達成しました$extract = Set::classicExtract($exifarray, '{n}.tag')

array(
      (int) 81 => 'ISOExpansion2',
      (int) 82 => 'LensType',
      (int) 83 => 'Lens',...
)
4

1 に答える 1

1

Set::classicExtract($exifarray, '{n}.tag');あなたが見たようにすべてのタグを抽出します。

Set :: matchesCakeBook link)は、単一のアイテムまたは特定のxpathが特定の条件に一致するかどうかを確認するために使用されます。ただし、これが文字列で機能するかどうかはわかりませんが、機能するはずです。したがって、実行した場合:

$data = Set::classicExtract($exifarray, '{n}.tag');

あなたが試すことができます:

foreach($data as $key => $test){
    if(Set:matches(array('0=Lens'), $test[$key])){
    //Logic to run when you have a match.
    }
}

これが機能しない場合は、同じ「foreach」方式で正規表現の一致を実行する必要があります。これは、ここで行うのが正しいことかもしれません。

そして少し注意: Setは現在非推奨です(Cake 2.2以降)。新しい、より優れた配列操作クラスであるハッシュがあります。見てみな。

于 2012-07-05T07:33:05.937 に答える