2017-09-21 3 views
1

に基づいて、ネストされたPHPの配列要素は、PHP配列を仮定見つけ、以下のフォーマットを有する:を効率的にJSONにキャストするとき、属性値

[{ 
    "key": "width", 
    "value": "1200", 
    "label": "Width (mm)", 
    "choice": "" 
}, 
{ 
    "key": "height", 
    "value": "900", 
    "label": "Height (mm)", 
    "choice": "" 
}, 
{ 
    "key": "material", 
    "value": "paper", 
    "label": "Material", 
    "choice": "Paper" 
}] 

(これはオリジナルの短縮バージョンであり、より多くを有することができます要素)

どのような素材が使用されているかを効率的に探したいとしましょう。言い換えれば、keyの値がmaterialの入れ子になった配列を検索し、valueを返したいと思います。paperです。

これはforeach/whileループを使用して行うことができますが、PHPにはよく慣れていないコンパイル済み配列関数が豊富であることがわかります。ここで使うのに最高の機能は何ですか?


UPDATE:私は試した何遠い

ここで私はこれまで試した二つのものです:

試み#1:

$json = '[{"key":"width","value":"1200","label":"Width (mm)","choice":""},{"key":"height","value":"900","label":"Height (mm)","choice":""},{"key":"material","value":"paper","label":"Material","choice":"Paper"}]'; 
$array = json_encode($json, true); 
$material = ''; 
foreach($array as $nestedArray) { 
    if($nestedArray['key'] = 'material') { 
    $material = $nestedArray['value']; 
    } 
} 

試行#2 :

$json = '[{"key":"width","value":"1200","label":"Width (mm)","choice":""},{"key":"height","value":"900","label":"Height (mm)","choice":""},{"key":"material","value":"paper","label":"Material","choice":"Paper"}]'; 
$array = json_decode($json, true); 
$filteredArray = array_filter($array, function($array) { 
    return ($array['key'] == 'material'); 
}); 
$arr = array_pop($filteredArray)['value']; 

どちらも正しい値を生成しますが、#1は面倒です。#2は、PHPの配列関数を使用するのに最適ではないかもしれません。

+0

はJSONテキスト文字列ですか?microoptimizeのように効率的な、またはメモリ使用量のように効率的に、あるいは効率的な – Andreas

+0

コードで書かれた?それはもともとJSONとして存在 – mario

+0

@Andreasテキスト文字列、正しい –

答えて

1

「値を見つける」ことに加えて、あなたが何をしたいかによって異なります。そして、あなたが持っているもの。

array_filterは単純ですが、配列全体をループします。縮小セットに

array_searchが速く見えますが、それは元の配列のコピーを作成する必要があるので、それは(あまりないことで)実際にarray_filterより遅くです。

あなたが最初に試さforeachソリューションは、余分な配列を作成しません、それはあなたが検索でブレークすることができます:私は受け入れた溶液でいいと思う短いアレイ上だから、

foreach($array as $nestedArray) { 
    if ($nestedArray['key'] == 'material') { 
     $material = $nestedArray['value']; 
     break; // <--- found! 
    } 
} 

array_columnを使用して、またはあなたの場合「このarray_column微調整があり、材料があることを確認し、再:

// Transform the records into keypairs 
$keypairs = array_column($records, 'value', 'key'); 

今鍵ペアはそう、[幅=> 900、材料=>紙、...]です:

$material = $keypairs['material']; 

私はarray_key_existsを追加します。これにより、array_searchが保存されます(それほど大きな利点ではありませんが、キーペアオブジェクトに使用する可能性があります)。

パフォーマンスが重視され、配列が大きい場合は、JSONの中で素材を探すというアイデアを放棄しません。それはコードのにおいだ場合でもstrpos、との文字列。

+0

10000回の反復で、この関数はより効率的で、キーペイを返すと便利になる可能性があります。私はこれに受け入れられた答えを変更しています、感謝@LSemi –

1

コメントに記載されているようにjsonのテキストの場合は、私のアドバイスは正規表現と一致しています。

これは "キーマテリアル"と "値"を見つけ、valueの値と一致します。
小さなサンプルでも動作しますが、大きな文字列で試してみる必要があります。

https://regex101.com/r/CSTLUL/1

$re = '/key\": \"material\",.*?\"value\": \"(.*?)\",/s'; 
$str = '{ 
"key": "width", 
"value": "1200", 
"label": "Width (mm)", 
"choice": "" 
}, 
{ 
"key": "height", 
"value": "900", 
"label": "Height (mm)", 
"choice": "" 
}, 
{ 
"key": "material", 
"value": "paper", 
"label": "Material", 
"choice": "Paper" 
}]'; 

preg_match_all($re, $str, $matches); 

// Print the entire match result 
var_dump($matches); 
+0

@Andreasの回答ありがとうございますが、私はPHP配列関数を使用してジガールの答えを好む –

+0

確かに。問題ない。 – Andreas

1

あなたはとてもループ

ワーキングデモ使用する必要array_searcharray_columnの組み合わせを使用することはできません。https://eval.in/865566

$data = '[{ 
    "key": "width", 
    "value": "1200", 
    "label": "Width (mm)", 
    "choice": "" 
}, 
{ 
    "key": "height", 
    "value": "900", 
    "label": "Height (mm)", 
    "choice": "" 
}, 
{ 
    "key": "material", 
    "value": "paper", 
    "label": "Material", 
    "choice": "Paper" 
}]'; 
$data = json_decode($data,True); 


$key = array_search('material', array_column($data, 'key')); // get key of array 
echo $data[$key]['value']; 

出力

paper 
+0

私が探していたものとまったく同じような華麗なもの。私はちょうどarray_search/array_columnトリックを見つけたが、それが正常に動作するのに問題があった。 –

+0

ありがとう、あなたを助けてうれしいよ:) –

関連する問題