• 締切済み

Array Array と表示される

Pagerを入れてみたらArray Arrayと表示されます。何が原因なのかわからず困っています。お力をお願い致します。

みんなの回答

  • 11spec0
  • ベストアンサー率83% (10/12)
回答No.14

おはようございます。jimmy1977様はPHPをどの程度やっているのでしょうか?print_r();は変数の中身を表示する関数です。pagerで生成された$pdataの次の行あたりでprint_rをかければよいかと思います。

jimmy1977
質問者

お礼

お返事ありがとうございます。はじめの質問のときにお話してましたが、PHPに関しては、ほとんど初心者で出来ていPHPのサンプルを自分のデザインに変える程度です。わからないことは、ソースを見ながら単語から検索して自分の出来ることをしています。今回はページ送りを自分でつけてみようと考えPHPの本を買ってみましたが、今回のサンプルが自分の能力では無理だと承知してますが、やってみようと思いました。ですから、専門的な言葉や、わかっているだろう基本の知識は残念ながら私にはありません。11spec0様にはご迷惑かと思いますが、このいただいた知識は今後役にたつと思っています。このことが終われば最初から勉強していきたいと思っています。

jimmy1977
質問者

補足

こんばんわ。 $page = Pager::factory($params); $pdata = $page->getPageData(); print_r($pdata['Body']['itemSearch:ItemSearch']['Items']['Item']); $plink = $page->getLinks(); 上記のように入れてみましたが、 Warning: Invalid argument supplied for foreach() in /usr/local/php5/pear/Pager/Common.php on line 1365 というエラーで変わりませんでした・・・

  • 11spec0
  • ベストアンサー率83% (10/12)
回答No.13

そうですか・・・単に print_r($pdata['Body']['itemSearch:ItemSearch']['Items']['Item']); で配列の値は表示されますでしょうか?

jimmy1977
質問者

お礼

いつもお返事ありがとうございます。また初歩的な質問で申し訳ないのですが、 print_r($pdata['Body']['itemSearch:ItemSearch']['Items']['Item']); の転記の仕方がわかりません・・・ どのようにしたらいいのでしょうか。

  • 11spec0
  • ベストアンサー率83% (10/12)
回答No.12

すいません。こちらのミスです。 $smarty->assign('tests',$pdata); $smarty->assign('plink',$plink[0]['all']); の部分を $smarty->assign('plink',$plink); $smarty->assign('tests',$pdata['Body']['itemSearch:ItemSearch']['Items']['Item']); と書き換え とありますが、 $smarty->assign('plink',$plink[0]['all']); $smarty->assign('tests',$pdata['Body']['itemSearch:ItemSearch'] ]['Items']['Item']); の間違えです。$plinkを配列のままアサインしている為にエラーが出力されたのではないかと思います。

jimmy1977
質問者

お礼

お返事ありがとうございます。 $smarty->assign('plink',$plink[0]['all']); $smarty->assign('tests',$pdata['Body']['itemSearch:ItemSearch']['Items']['Item']); に書き直しても、下記エラーが出てしまいます。 Warning: Invalid argument supplied for foreach() in /usr/local/php5/pear/Pager/Common.php on line 1365 tpl側もいろいろと試してみましたが結果は同じでした・・・

  • 11spec0
  • ベストアンサー率83% (10/12)
回答No.11

今思い出したのですが、前に書いていただいた配列 Array ( [header:Header] => 1 [0] => Array ( [Args] => Array ( [Arg] => Array ( [0] => 1 [1] => 1 [2] => 1 [3] => 1 [4] => 1 [5] => 1 [6] => 1 [7] => 1 [8] => 1 [9] => 1 [10] => 1 ) ) [Status] => Success [StatusMsg] => ) [Body] => Array ( [itemSearch:ItemSearch] => Array ( [count] => 1210027 [page] => 1 [first] => 1 [last] => 30 [hits] => 30 [carrier] => 0 [pageCount] => 100 [Items] => Array ( [Item] => Array   ←←←下記で説明している部分はここ ( [0] => Array ( [itemName] => ビリーズブートキャンプ DVD版 ビリーバンド×1セット [itemCode] => shopjapan:790183 [itemPrice] => 14700 [itemCaption] => セット内容/DVDx4枚(日本語字幕版)、ポケットメジャーx1個 、 ビリーバンドx1セット(2本) サイズ(約)/ビリーバンド 約1m 原産国/DVD/日本製 送料/945円(税込) お届期間/約1週間 ※4枚で1セットの商品です。 [itemUrl] => http://www.rakuten.co.jp/shopjapan/651695/616400/751322/#790183? [affiliateUrl] => http://***/hgc/07cc938c.6216a6e1.07cc938d.81dbd9bf... [imageFlag] => 1 [smallImageUrl] => http://image.rakuten.co.jp/wshop/data/ws-mall-img/shopjapan/img64/i... [mediumImageUrl] => http://image.rakuten.co.jp/wshop/data/ws-mall-img/shopjapan/img128/... [availability] => 1 [taxFlag] => 0 [postageFlag] => 1 [creditCardFlag] => 0 [shopOfTheYearFlag] => 1 [affiliateRate] => 4.9 [startTime] => [endTime] => [reviewCount] => 4960 [reviewAverage] => 4.37 [shopName] => ショップジャパン 楽天市場店 [shopCode] => shopjapan [shopUrl] => http://www.rakuten.co.jp/shopjapan/ [genreId] => 100985 ) [1] => ・・・続く ) ) ) ) ) の中にある [Item] => Array ( [0] => Array ( [itemName] => ビリーズブートキャンプ DVD版 ビリーバンド×1セット [itemCode] => shopjapan:790183 [itemPrice] => 14700 [itemCaption] => セット内容/DVDx4枚(日本語字幕版)、ポケットメジャーx1個 、 ビリーバンドx1セット(2本) サイズ(約)/ビリーバンド 約1m 原産国/DVD/日本製 送料/945円(税込) お届期間/約1週間 ※4枚で1セットの商品です。 [itemUrl] => http://www.rakuten.co.jp/shopjapan/651695/616400/751322/#790183? [affiliateUrl] => http://***/hgc/07cc938c.6216a6e1.07cc938d.81dbd9bf... [imageFlag] => 1 [smallImageUrl] => http://image.rakuten.co.jp/wshop/data/ws-mall-img/shopjapan/img64/i... [mediumImageUrl] => http://image.rakuten.co.jp/wshop/data/ws-mall-img/shopjapan/img128/... [availability] => 1 [taxFlag] => 0 [postageFlag] => 1 [creditCardFlag] => 0 [shopOfTheYearFlag] => 1 [affiliateRate] => 4.9 [startTime] => [endTime] => [reviewCount] => 4960 [reviewAverage] => 4.37 [shopName] => ショップジャパン 楽天市場店 [shopCode] => shopjapan [shopUrl] => http://www.rakuten.co.jp/shopjapan/ [genreId] => 100985 ) [1] => ・・・続く ) この部分のみうまく取り出してforeachのfromに対してアサインすれば、tpl側で $test.itemName $test.itemCode $test.itemCaption ・・・ と言うように簡単に取り出せます。 と言う事はアサイン時に php側 $smarty->assign('plink',$plink); $smarty->assign('tests',$pdata['Body']['itemSearch:ItemSearch']['Items']['Item']); でアサインしてあげれば、 TPL側では上記の配列で表示したい要素を <div>{$plink}</div> {foreach name=test item=test from=$tests} アイテム名 : {$test.itemName} コード : {$test.itemcCode} <img src="{$test.mediumImageUrl}" /> ・・・ {/foreach} <div>{$plink}</div> で取り出せるはずです。試してみてください。

jimmy1977
質問者

お礼

こんにちは。いつもありがとうございます。11spec0様がおっしゃられたように $smarty->assign('tests',$pdata); $smarty->assign('plink',$plink[0]['all']); の部分を $smarty->assign('plink',$plink); $smarty->assign('tests',$pdata['Body']['itemSearch:ItemSearch']['Items']['Item']); と書き換え tpl側を {show_bom} <div align="center">{$plink}</div> {if total_count > 0} {items} {foreach name=test item=test from=$tests} <p style="text-align : center; overflow : hidden;"> {if $test.is_image}<a href="{$test.affiliate_link}" target="_blank"><img src="{$test.medium_image_url}" alt="{$test.title|mb_truncate:100:" ..."}" style="border : 1px solid #999999;" /></a><br />{/if} <a href="{$test.affiliate_link}" target="_blank">{$test.title|mb_truncate:100:" ..."}</a><br /> {$test.price|number_format}円<br /> (<a href="{$test.shop_affiliate_link}" target="_blank">{$test.shop_name|mb_truncate:100:" ..."}</a>) </p> {/foreach} {/items} <div align="center">{$plink}</div> {else}{* if total_count > 0 の条件を満たさない場合 *} <p>検索条件に合う商品はありません。</p> {/if}{* if total_count > 0 *} としましたら、下記のように表示されました。 Warning: Invalid argument supplied for foreach() in /usr/local/php5/pear/Pager/Common.php on line 1365 Array 検索条件に合う商品はありません。 11spec0様が言うように $test.itemName $test.itemCode $test.itemCaption の意味はわかるのですが、tpl側にはこのitemNameの文字が出てこないのですが、tpl側を作り直した方がいいのでしょうか。

jimmy1977
質問者

補足

こんにちは。たびたびすみませんが、見て頂いたサンプルファイルのapp→rakuten→plugins→block.items.php このblock.items.phpの方は関係ないのでしょうか。よろしくお願いいたします。

  • 11spec0
  • ベストアンサー率83% (10/12)
回答No.10

いえ、エラーを見て分かるようにpagerのcommon.phpのエラーです。私が思うにきちんと値が取れていないのだと思います。前回説明したとおりにTPL側で値をとればエラーは出ないと思いますが。ただ、私が書いたロジックをそのままコピペして使っても駄目だと思います。私はアサインされた配列に対してこういう要素(キー)があるのではないかという想像で作っただけですので。 {foreach name=test item=test from=$tests} ・・・ {/foreach} ・・・の値を取得部分はjimmy1977様が調べて$test.要素を書き換えて下さい。 ちょっとこれ以上の説明はデバッグしながらやらないとこちら側は分かりません。

jimmy1977
質問者

お礼

お返事ありがとうございます。11spec0様がおっしゃるとおり、コピペしていては勉強にならないのでいろいろと調べながらがんばっています。きっと$test.要素が配列でもオブジェクトでもないところについているからだと思います。print_rで抽出した部分を確認しながらがんばって11spec0様に成功したと報告できるようにがんばります。

  • 11spec0
  • ベストアンサー率83% (10/12)
回答No.9

tpl側はこんなふうな解釈でよいのでしょうか。 {foreach name=test item=test from=$tests} <p style="text-align : center; overflow : hidden;"> {if $is_image}<a href="{$affiliate_link}" target="_blank"><img src="{$medium_image_url}" alt="{$title|mb_truncate:100:" ..."}" style="border : 1px solid #999999;" /></a><br />{/if} <a href="{$affiliate_link}" target="_blank">{$title|mb_truncate:100:" ..."}</a><br /> {$price|number_format}円<br /> (<a href="{$shop_affiliate_link}" target="_blank">{$shop_name|mb_truncate:100:" ..."}</a>) </p> {/foreach} このやり方では値が取得できません。なぜかと言うとそれぞれ$title,$medium等々のように直接指定してしまうと個別に smarty->assign('title',$変数); というようにアサインしなければならないからです。PHPのforeachを思い浮かべていただければイメージしやすいかと思います。 {foreach name=test item=test from=$tests} 部分を分かりやすく説明すると fromがPHPのforeachで例えると foreach($tests as $test){ } の$testsになります。そしてitemが$testになります。 つまり、{foreach name=test item=test from=$tests} の$testsに対して回すデータをアサインします。 smarty->assign('tests',$pdata); testsにアサインされたデータをtpl側で取り出すにはitemであるtestを使用し取り出します。 先ほどのtplファイルを例にすると {foreach name=test item=test from=$tests} <p style="text-align : center; overflow : hidden;"> {if $test.is_image}<a href="{$test.affiliate_link}" target="_blank"><img src="{$test.medium_image_url}" alt="{$test.title|mb_truncate:100:" ..."}" style="border : 1px solid #999999;" /></a><br />{/if} <a href="{$test.affiliate_link}" target="_blank">{$test.title|mb_truncate:100:" ..."}</a><br /> {$test.price|number_format}円<br /> (<a href="{$test.shop_affiliate_link}" target="_blank">{$test.shop_name|mb_truncate:100:" ..."}</a>) </p> {/foreach} になります。この$test.titleというのはPHPのforeachで説明すると、 $test['title']と同じ意味になります。 こんな感じでデータをテンプレートにセットしてあげれば今まで個別イにアサインしていた部分は不要になり、pagerによって作られた実データと、ページのリンクデータによってpagerを実装する事ができると言うわけです。この部分が出来ればsmartyでpagerが完成です。

jimmy1977
質問者

お礼

毎回、ご丁寧なお返事ありがとうございます。まだまだ、PHPを理解することはできていませんが、ぼんやりとわかってきたような感じがします。11spec0様がご説明していただいたよう書き直しましたら、下記のようなエラーがでてしまいました。このいったエラーの場合は、レンタルサーバーの方のCommon.phpがエラーと返しているのでしょうか。それとも、やはり私側のどこかがおかしいのでしょうか。よろしくお願い致します。 Warning: Invalid argument supplied for foreach() in /usr/local/php5/pear/Pager/Common.php on line 723

  • 11spec0
  • ベストアンサー率83% (10/12)
回答No.8

なるほど。結局のところ、先ほど教えていただいた配列の商品内容をアサインしたいわけですよね。 ということは、pagerで生成された配列をただアサインしても分解してアサインしていないので、 当たり前ですが、表示上は Arrayになります。また、いままで個別に突っ込んでアサインしていた $smarty->assign('is_null_cell', 0); $smarty->assign('title', $items[$ctr]['itemName']); $smarty->assign('item_code', $items[$ctr]['itemCode']); $smarty->assign('price', $items[$ctr]['itemPrice']); $smarty->assign('description', $items[$ctr]['itemCaption']); $smarty->assign('link', $items[$ctr]['itemUrl']); $smarty->assign('affiliate_link', $items[$ctr]['affiliateUrl']); $smarty->assign('is_image', $items[$ctr]['imageFlag']); $smarty->assign('small_image_url', $items[$ctr]['smallImageUrl']); $smarty->assign('medium_image_url', $items[$ctr]['mediumImageUrl']); $smarty->assign('is_available', $items[$ctr]['availability']); $smarty->assign('is_include_tax', $items[$ctr]['taxFlag']); $smarty->assign('is_include_postage', !$items[$ctr]['postageFlag']); $smarty->assign('is_credit_card', $items[$ctr]['creditCardFlag']); $smarty->assign('is_shop_of_the_year', $items[$ctr]['shopOfTheYearFlag']); $smarty->assign('affiliate_rate', $items[$ctr]['affiliateRate']); ・・・続く の部分は不要になります。なぜかといいますと、pagerによって生成された商品データ(配列)が 既にありますので。この生成されたデータを分解アサインし、表示部分を作っていきます。 まず、 $page = Pager::factory($params); $pdata = $page->getPageData(); $plink = $page->getLinks(); で生成された実データ$pdataをアサインします。 tpl側 {*<!--▼pager parts-->*} <div align="center">{$plink}</div> {*<!--▲pager parts-->*} {*<!--▼body-->*} {foreach name=test item=test from=$tests} <p style="text-align : center; overflow : hidden;"> {if $is_image}<a href="{$test.affiliate_link}" target="_blank"><img src="{$test.medium_image_url}" alt="{$test.title|mb_truncate:100:" ..."}" style="border : 1px solid #999999;" /></a><br />{/if} <a href="{$test.affiliate_link}" target="_blank">{$test.title|mb_truncate:100:" ..."}</a><br /> {$test.price|number_format}円<br /> (<a href="{$test.shop_affiliate_link}" target="_blank">{$test.shop_name|mb_truncate:100:" ..."}</a>) </p> {/foreach} {*<!--▲body-->*} {*<!--▼pager parts-->*} <div align="center">{$plink}</div> {*<!--▲pager parts-->*} php側 #アサイン部分 $smarty->assign('tests',$pdata); $smarty->assign('plink',$plink[0]['all']); これだけでpagerは実装できます。コメントとして書いておいたbody部分の$test.要素名は調整 しつつ動きを見てください。

jimmy1977
質問者

お礼

おはようございます。本当にいろいろとありがとうございます。11spec0様の言われた事を私の解釈があっているのか不安なので、ご指導お願い致します。 「いままで個別に突っ込んでアサインしていた部分は不要になります」ということは下記のものはいらなくなるといううことで良いでしょうか。 $params = array( 'perPage' => $max, 'itemData' => $data ); 上記部分が無くした状態で、PHP側は $page = Pager::factory($params); $pdata = $page->getPageData(); $plink = $page->getLinks(); $smarty->assign('tests',$pdata); $smarty->assign('plink',$plink[0]['all']); を転記するだけでよいのでしょうか。また転記する場所は決まりがあるのでしょうか。 tpl側はこんなふうな解釈でよいのでしょうか。 {show_bom} {if $total_count > 0} {items} <div align="center">{$plink}</div> {foreach name=test item=test from=$tests} <p style="text-align : center; overflow : hidden;"> {if $is_image}<a href="{$affiliate_link}" target="_blank"><img src="{$medium_image_url}" alt="{$title|mb_truncate:100:" ..."}" style="border : 1px solid #999999;" /></a><br />{/if} <a href="{$affiliate_link}" target="_blank">{$title|mb_truncate:100:" ..."}</a><br /> {$price|number_format}円<br /> (<a href="{$shop_affiliate_link}" target="_blank">{$shop_name|mb_truncate:100:" ..."}</a>) </p> {/foreach} <div align="center">{$plink}</div> {/items} {else}{* if $total_count > 0 の条件を満たさない場合 *} <p>検索条件に合う商品はありません。</p> {/if}{* if $total_count > 0 *} 結果はといいますと、下記エラーがでてしまいました。 Warning: Invalid argument supplied for foreach() in /usr/local/php5/pear/Pager/Common.php on line 1365 馬鹿な自分が嫌になります。

  • 11spec0
  • ベストアンサー率83% (10/12)
回答No.7

$params = array( 'perPage' => $max, 'itemData' => $data ); こちらで使用している $dataを単純に print_r($data); するとどういう配列データが入っておりますか? こちらがわかればアサインしやすいのでよろしくお願いします。 今日は時間があるので、できれば早めにご連絡いただけると助かります。

jimmy1977
質問者

お礼

おはようございます。早速のお返事ありがとうございます。本当に申し訳ないのですが、私はお盆休みなく仕事となので、今は試すことができません・・・5時過ぎに家に帰ってすぐに試してお返事しますので、勝手で申し訳ないのですがお待ちいただけますでしょうか。もし会社内でできればやってみます。

jimmy1977
質問者

補足

こんにちは。ご指摘頂いたように下記のようにしましたら $params = array( 'perPage' => $max, 'itemData' => print_r($data) ); $page = Pager::factory($params); $pdata = $page->getPageData(); $plink = $page->getLinks(); $smarty->assign('pagelink',$plink['all']); $smarty->assign('pagedata',$pdata); このような商品情報が商品配列の上に表示されました。 Array ( [header:Header] => Array ( [Args] => Array ( [Arg] => Array ( [0] => true [1] => true [2] => true [3] => true [4] => true [5] => true [6] => true [7] => true [8] => true [9] => true [10] => true ) ) [Status] => Success [StatusMsg] => ) [Body] => Array ( [itemSearch:ItemSearch] => Array ( [count] => 1210027 [page] => 1 [first] => 1 [last] => 30 [hits] => 30 [carrier] => 0 [pageCount] => 100 [Items] => Array ( [Item] => Array ( [0] => Array ( [itemName] => ビリーズブートキャンプ DVD版(ビリーバンド×1セット) [itemCode] => shopjapan:790183 [itemPrice] => 14700 [itemCaption] => セット内容/DVDx4枚(日本語字幕版)、ポケットメジャーx1個 、ビリーバンドx1セット(2本) サイズ(約)/ビリーバンド 約1m 原産国/DVD/日本製 送料/945円(税込) お届期間/約1週間 ※4枚で1セットの商品です。[itemUrl] => http://www.rakuten.co.jp/shopjapan/651695/616400/751322/#790183 [affiliateUrl] => http://***/hgc/07cc938c.6216a6e1.07cc938d.81dbd9bf/?pc=http%3A%2F%2Fwww.rakuten.co.jp%2Fshopjapan%2F651695%2F616400%2F751322%2F%23790183 [imageFlag] => 1 [smallImageUrl] => http://image.rakuten.co.jp/wshop/data/ws-mall-img/shopjapan/img64/img10302873546.jpeg [mediumImageUrl] => http://image.rakuten.co.jp/wshop/data/ws-mall-img/shopjapan/img128/img10302873546.jpeg [availability] => 1 [taxFlag] => 0 [postageFlag] => 1 [creditCardFlag] => 0 [shopOfTheYearFlag] => 1 [affiliateRate] => 4.9 [startTime] => [endTime] => [reviewCount] => 4960 [reviewAverage] => 4.37 [shopName] => ショップジャパン 楽天市場店 [shopCode] => shopjapan [shopUrl] => http://www.rakuten.co.jp/shopjapan/ [genreId] => 100985 ) [1] => Array ( [itemName] => 3000人の評価見て!JJモデル宮内美妃さんも愛用[itemCode] => snk:10000083 [itemPrice] => 13440 [itemCaption] => ★CM等で大人気のJJモデル白雪も絶賛♪ 100%ピュアセラミックプレートによるイオン&遠赤外線&摩擦減少効果・ [itemUrl] => http://item.rakuten.co.jp/snk/as2565rj/ [affiliateUrl] => http://***/hgc/07cc938c.6216a6e1.07cc938d.81dbd9bf/?pc=http%3A%2F%2Fitem.rakuten.co.jp%2Fsnk%2Fas2565rj%2F [imageFlag] => 1 [smallImageUrl] => http://thumbnail.image.rakuten.co.jp/@0_gold/snk/R-Storefront/img/iron/as2565rj.jpg?_ex=64x64 [mediumImageUrl] => http://thumbnail.image.rakuten.co.jp/@0_gold/snk/R-Storefront/img/iron/as2565rj.jpg?_ex=128x128 [availability] => 1 [taxFlag] => 0 [postageFlag] => 0 [creditCardFlag] => 1 [shopOfTheYearFlag] => 0 [affiliateRate] => 1.0 [startTime] => [endTime] => [reviewCount] => 1822 [reviewAverage] => 4.73 [shopName] => 理容室・美容室専売品のSNK Beauty [shopCode] => snk [shopUrl] => http://www.rakuten.co.jp/snk/ [genreId] => 101878 ) [2] => 続く・・・・ 最後 [endTime] => [reviewCount] => 462 [reviewAverage] => 4.42 [shopName] => 赤や(インテリア家具通販) [shopCode] => k-akaya [shopUrl] => http://www.rakuten.co.jp/k-akaya/ [genreId] => 406392 ) ) ) ) ) ) Warning: Invalid argument supplied for foreach() in /usr/local/php5/pear/Pager/Common.php on line 723 商品配列の下には、 Arrayと表示されています。よろしくお願い致します。

  • 11spec0
  • ベストアンサー率83% (10/12)
回答No.6

先ほど少し拝見させていただきました。原因はアサインの仕方ですね。今仕事ですので、家に帰りましたら、ご連絡させていただきます。もう少しで出来ますので、頑張りましょう!

jimmy1977
質問者

お礼

もう返事がこないと諦めていました。本当にありがとうございます。本当に感謝しています。

  • 11spec0
  • ベストアンサー率83% (10/12)
回答No.5

直接的にファイルを見ないとなんとも言えないですね。HTML側も全体的にどうなっているのかもわかりませんし・・・問題自体の範囲も大きいので。

jimmy1977
質問者

お礼

お返事ありがとうございます。

関連するQ&A