人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPコードの間違いをご指摘ください

■やりたいこと
楽天と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 円」とだけ表示されます。
根本的に間違っているのだと思うのですが、ご指摘いただけませんでしょうか。

●質問者: cafe-beret
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

質問者から

以下のサイトを参考に作成しています。
http://web.shirakabako.net/rakutenichiba/itemsearch/code.html
http://web.shirakabako.net/yahooshopping/itemsearch/code.html

文字数の関係で中略していますが、検索結果をxmlで受け取ることには成功しています。


よろしくお願い致します。


1 ● だわかき
●200ポイント

$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
●300ポイント ベストアンサー
<?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で各項目を表示します。


質問者から

お二人ともありがとうございました。

2つとも、今の私には思いつかない内容で、大変勉強になりました。
今回はtobeoscontinueさんのコードを元にさせていただいたため、ベストアンサーとしました。


コメントを頂いた皆様もありがとうございました。


関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ