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

回答の条件
  • 1人50回まで
  • 登録:
  • 終了:2013/08/04 13:12:17
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。
id:cafe-beret

以下のサイトを参考に作成しています。

http://web.shirakabako.net/rakutenichiba/itemsearch/code.html

http://web.shirakabako.net/yahooshopping/itemsearch/code.html

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


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

ベストアンサー

id:tobeoscontinue No.2

回答回数220ベストアンサー獲得回数59

ポイント300pt
<?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で各項目を表示します。

その他の回答1件)

id:dawakaki No.1

回答回数797ベストアンサー獲得回数122

ポイント200pt

$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 } ?>
id:tobeoscontinue No.2

回答回数220ベストアンサー獲得回数59ここでベストアンサー

ポイント300pt
<?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で各項目を表示します。

id:cafe-beret

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

2つとも、今の私には思いつかない内容で、大変勉強になりました。

今回はtobeoscontinueさんのコードを元にさせていただいたため、ベストアンサーとしました。


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

  • id:psne
    デバッグできない環境でしょうか。
    とりあえず、
    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
  • id:skkirby0429
    もう一度コピーしてもおかしいんですか?
    じゃあそのソート自体がおかしいのかもしれません。
  • id:cafe-beret
    ありがとうございます。デバッグできない環境というわけではありません。

    >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];
    }

    のあとに置くと値が表示されない(この前は値が出る)ため、ここに問題があるのかもしれません。
  • id:Lhankor_Mhy
    なんかいろいろ間違っているような。
     
    $rakuten_data[] = array($itemName = $item->itemName, $itemPrice = $item->itemPrice,…中略…);
     
    は、配列を作ろうとしてるのでしょうか、それとも連想配列?

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません