■やりたいこと
楽天とYahooショッピングの商品検索APIの結果を混ぜ、条件でソートした30件を表示。
<?php
//<- rakuten
…中略…
$xml = simplexml_load_string($data);
//-> rakuten
//<- yahoo
…中略…
$yxml = simplexml_load_file($yfile);
//-> yahoo
$item = ($xml->Body->itemsearch->Items->Item);
$rakuten_data = array();
$rakuten_data[] = array($itemName = $item->itemName, $itemPrice = $item->itemPrice,…中略…);
$Hit = ($yxml->Result->Hit);
$yahoo_data = array();
$yahoo_data[] = array($itemName = $Hit->Name, $itemPrice = $Hit->Price, …中略…);
$merge_data = array_merge($rakuten_data,$yahoo_data);
foreach($merge_data as $key => $value) {
$price[$key] = $value[$itemPrice];
}
array_multisort($price, SORT_DESC, $merge_data);
foreach($merge_data as $result) {
print $result;
?>
<?=mb_substr($result[$itemName],0,25,'UTF-8')?>
<?=$result[$itemPrice]?> 円
<a href="<?=$item[$affiliateUrl]?>" target="blank"><img src="<?=$item[$smallImageUrl]?>"></a>
<?=$result[$itemCaption]?>
<?php } ?>
これでは「Array 円 Array 円」とだけ表示されます。
根本的に間違っているのだと思うのですが、ご指摘いただけませんでしょうか。
<?php $rakuten_data = array(); foreach ($xml->Body->itemsearch->Items->Item as $item) { $rakuten_data[] = array('ItemName'=>(string)$item->itemName, 'ItemPrice'=>(string)$item->itemPrice, 'smallImageUrl'=>(string)$item->smallImageUrl, 'affiliateUrl'=>(string)$item->affiliateUrl, 'ItemCaption'=>(string)$item->itemCaption); } $yahoo_data = array(); foreach ($yxml->Result->Hit as $Hit) { $yahoo_data[] = array('ItemName'=>(string)$Hit->Name, 'ItemPrice'=>(string)$Hit->Price, 'smallImageUrl'=>(string)$Hit->Image->Small, 'affiliateUrl'=>'', 'ItemCaption'=>(string)$Hit->Description); } $merge_data = array_merge($rakuten_data,$yahoo_data); function cmp_func($a, $b) { global $SORT_field; $field = $SORT_field; if ($a[$field] == $b[$field]) { return 0; } return ($a[$field] < $b[$field]) ? -1 : 1; } $SORT_field = 'ItemPrice'; usort($merge_data, "cmp_func"); foreach(array_slice($merge_data,0,30) as $result) { ?> <?=mb_substr($result["ItemName"],0,25,'UTF-8')?> <?=$result["ItemPrice"]?> 円 <a href="<?=$result["affiliateUrl"]?>" target="blank"><img src="<?=$result["smallImageUrl"]?>"></a> <?=$result["ItemCaption"]?> <?php } ?>
Yahooと楽天ではxmlでの名前が異なるのでyahoo_dataとrakuten_dataとでは連想配列を利用して同一の名前を使用します。
YahooではaffiliateUrlに該当するものが無いようなので空にしています。
sortはソート項目が変更できるようにusortを使用してみました。
array_sliceで上位30を取り出しforeachで各項目を表示します。
以下のサイトを参考に作成しています。
http://web.shirakabako.net/rakutenichiba/itemsearch/code.html
http://web.shirakabako.net/yahooshopping/itemsearch/code.html
文字数の関係で中略していますが、検索結果をxmlで受け取ることには成功しています。
よろしくお願い致します。
$itemPriceの値が何だかわかりませんが、下記のスクリプトで試してみて下さい。
<?php function mysort($a, $b) { global $itemPrice; return ($a[$itemPrice] < $b[$itemPrice]) ? -1 : 1; } //<- rakuten …中略… $xml = simplexml_load_string($data); //-> rakuten //<- yahoo …中略… $yxml = simplexml_load_file($yfile); //-> yahoo $item = ($xml->Body->itemsearch->Items->Item); $rakuten_data = array(); $rakuten_data[] = array($itemName = $item->itemName, $itemPrice = $item->itemPrice,…中略…); $Hit = ($yxml->Result->Hit); $yahoo_data = array(); $yahoo_data[] = array($itemName = $Hit->Name, $itemPrice = $Hit->Price, …中略…); $merge_data = array_merge($rakuten_data,$yahoo_data); usort($merge_data, mysort); foreach($merge_data as $result) { print $result; ?> <?=mb_substr($result[$itemName],0,25,'UTF-8')?> <?=$result[$itemPrice]?> 円 <a href="<?=$item[$affiliateUrl]?>" target="blank"><img src="<?=$item[$smallImageUrl]?>"></a> <?=$result[$itemCaption]?> <?php } ?>
お二人ともありがとうございました。
2つとも、今の私には思いつかない内容で、大変勉強になりました。
今回はtobeoscontinueさんのコードを元にさせていただいたため、ベストアンサーとしました。
コメントを頂いた皆様もありがとうございました。
とりあえず、
var_dump($result[$itemPrice]);
を
foreach($merge_data as $result) {
print $result;
?>
となっている処の、foreachから始まる行の次辺りに1行挿入して、$result[$itemPrice]の中身がどうなっているか確認しましょう。
var_dumpって何?というのはこちらです。
http://php.net/manual/ja/function.var-dump.php
じゃあそのソート自体がおかしいのかもしれません。
>var_dump($result[$itemPrice]);
>を
>foreach($merge_data as $result) {
の下に挿入してみましたら、
NULL Array 円 NULL Array 円
となったため、正しく取得できていないようです。
教えていただいたvar_dumpを色々なところで試してみたら、
foreach($merge_data as $key => $value) {
$price[$key] = $value[$itemPrice];
}
のあとに置くと値が表示されない(この前は値が出る)ため、ここに問題があるのかもしれません。
$rakuten_data[] = array($itemName = $item->itemName, $itemPrice = $item->itemPrice,…中略…);
は、配列を作ろうとしてるのでしょうか、それとも連想配列?