これはより複雑な例ですが、スパゲッティ コードよりは優れています。最初に配列を XML に変換します。
// this is your initial array
$my_array = array(
array("city"=>309, "store"=>12, "apples"=>21, "oranges"=>14, "lichis"=>34 ),
array("city"=>309, "store"=>13, "apples"=>0, "oranges"=>11, "lichis"=>32 ),
array("city"=>309, "store"=>14, "apples"=>44, "oranges"=>61, "lichis"=>0 ),
array("city"=>309, "store"=>15, "apples"=>7, "oranges"=>0, "lichis"=>6 ),
array("city"=>309, "store"=>16, "apples"=>0, "oranges"=>0, "lichis"=>12 ),
);
ストアを手動で分離するためのスパゲッティ コードを記述すると、if ステートメントとループの厄介なジャングルになります。
// might as well convert it to xml
function array_to_xml( $data ) {
$xml = "<xml>\n";
foreach( $data as $row ) {
$xml .= "<entry>";
foreach( $row as $k => $v ) {
$xml .= "<{$k}>{$v}</{$k}>";
}
$xml .= "</entry>\n";
}
$xml .= "</xml>\n";
return( $xml );
}
この時点で、$xml
(文字列として) 次のようになり、より管理しやすくなります。
<xml>
<entry>
<city>309</city>
<store>12</store>
<apples>21</apples>
<oranges>14</oranges>
<lichis>34</lichis>
</entry>
...(more entries)...
</xml>
次に、XML 標準である XPath でクエリ可能なものにロードします。
$xml = simplexml_load_string( array_to_xml( $my_array ) );
市内のすべての特定の果物の数 (つまり、市 309 にあるリンゴ、オレンジ、ライチの合計数) を取得するには、単純ですが再利用可能な集計関数が必要です。
// so lets make a generic function to count specific items
function count_items( $stores, $items = array() ) {
$sum = array();
foreach( $stores as $store ) {
foreach( $items as $k ) {
if( !isset( $sum[$k] ) ) $sum[$k] = 0;
$sum[$k] += $store->$k;
}
}
return( $sum );
}
都市 309 のみが必要であり、特にリンゴ、オレンジ、およびライチを探します。これらは果物であるためです。
$only_this_city = $xml->xpath("//entry[city=309]");
print_r( count_items( $only_this_city, array("apples", "oranges", "lichis")) );
これを取得します:
Array
(
[apples] => 72
[oranges] => 86
[lichis] => 84
)
次に、特定のストアの値を取得するには:
$only_this_store = $xml->xpath("//entry[city=309 and store=14]");
print_r( count_items( $only_this_store, array("apples") ) );
あなたは得る:
Array
(
[apples] => 44
)
明らかに、より多くのアイテムをリクエストしたり、より複雑なクエリを実行したりできます。今後のクエリについては、XPath に関するドキュメントを参照してください。