2012-09-11 15 views
16

flickrs APIからJSONを取得しています。私の問題は、exifデータがカメラによって異なる順序であることです。だから私は、例えば、以下のカメラモデルを得るために配列番号をハードコードすることはできません。 PHPには連想配列の値を検索して一致する配列を返す組み込みのメソッドがありますか?下の私の例では、[label] => Modelを検索し、[_content] => NIKON D5100を取得したいと考えています。検索結合配列by value

私が詳細に説明したい場合はお知らせください。

print_r($exif['photo']['exif']); 

結果:

Array 
(
    [0] => Array 
     (
      [tagspace] => IFD0 
      [tagspaceid] => 0 
      [tag] => Make 
      [label] => Make 
      [raw] => Array 
       (
        [_content] => NIKON CORPORATION 
       ) 

     ) 

    [1] => Array 
     (
      [tagspace] => IFD0 
      [tagspaceid] => 0 
      [tag] => Model 
      [label] => Model 
      [raw] => Array 
       (
        [_content] => NIKON D5100 
       ) 

     ) 

    [2] => Array 
     (
      [tagspace] => IFD0 
      [tagspaceid] => 0 
      [tag] => XResolution 
      [label] => X-Resolution 
      [raw] => Array 
       (
        [_content] => 240 
       ) 

      [clean] => Array 
       (
        [_content] => 240 dpi 
       ) 

     ) 
+0

@Joganあなたは私にこれを手伝ってもらえますか?https://stackoverflow.com/questions/44721195/php-how-do-i-apply-multiple-filtering-conditions-passed-as-an-array-of - アレイ? – Valay

答えて

15

私の知る限り、そのような機能はありません。 array_searchがありますが、それはあなたが望むことを全くしません。

私は、最も簡単な方法は自分でループを書くことだと思います。

function search_exif($exif, $field) 
{ 
    foreach ($exif as $data) 
    { 
     if ($data['label'] == $field) 
      return $data['raw']['_content']; 
    } 
} 

$camera = search_exif($exif['photo']['exif'], 'model'); 
+2

汎用ソリューションに感謝します:-) – Johan

+1

しかし、 'in'は' as'であるべきです。そして、「then」を削除する必要がありますか? @ Johan。 – Johan

+2

実際に、複数のプログラミング言語を使用する場合、それらを混在させることがあります。 :) – GolezTrol

4

これは、実装がかなり些細なことになります。

$model = ''; 

foreach ($exif['photo']['exif'] as $data) { 
    if ($data['label'] == 'Model') { 
     $model = $data['raw']['_content']; 
     break; 
    } 
} 
+0

ありがとう、ちょうど私が必要なもの! – Johan

2
foreach($exif['photo']['exif'] as $row) { 
    foreach ($row as $k => $v) { 
     if ($k == "label" AND $v == "Model") 
      $needle[] = $row["raw"]; 
    } 
} 
print_r($needle); 
+0

あなたのコードを編集するには、 '$ needle [] = $ row ['raw']' – diEcho

0

私の知る限り、PHPには多次元配列の組み込み検索機能がありません。これは、索引付けおよび連想配列に対してのみ使用できます。したがって、あなた自身の検索機能を書く必要があります!

12

array_search( 'モデル'、array_mapを(関数($データ){[ 'ラベル'] $データを返す;} $のEXIF))最新のPHPで

+1

私はこの方法が、ここに挙げた残りの部分よりずっと優れています!その真のPHP、そして個人的には従来のforeachメソッドよりもはるかに高速です。誰かがこれをベンチマーク! –

+0

'array_search' +' array_map'対ループのパフォーマンスに関する証拠はありますか? – userlond

18
$key = array_search('model', array_column($data, 'label')); 

、上記機能が動作します。

+0

私はこの答えが最も効率的なソリューションだと思います。 – Behzadsh