質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

1回答

1358閲覧

Cakephp 画像が入ってるのに何も入ってない時のメッセージが出てしまう

hyskyo

総合スコア79

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2015/10/18 14:37

編集2015/10/18 14:38

何も入ってない場合は<何も入ってません>とメッセージだけを表示;
でも画像が入ってたら画像だけを表示して、<何も入ってません>とのメッセージは非表示にたいですが
画像入ってるのにもメッセージもでてしまいます、どうしたら解決できます!!foreach文 とif 文 の使い方の問題ですか?
よろしく願いします

下記が全コードです:

<?php foreach($result as $val) : ?>
<?php if ($val['Iteam']['count'] == 0) : ?> <div>何も入っていません</div> <?php else : ?> <?php echo '<a href="'.$val['Iteam']["url"].'"><img src="'.$this->webroot.$val['Iteam']['image'].'" /></a>';?> <?php echo '<br><p>Liked:'.$val['Iteam']['count'].'</p>'; ?> <?php endif ; ?>
<?php endforeach; ?>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ひとつ確認をしたいのですが、$resultはどのような配列を想定しているのでしょうか?
ループの中で、$val['Iteam']['count']でデータを取り出していることから、以下に示すような
多次元配列となっているのかなと思ったのですが、あってますか?

PHP

1$result = array ( 2 array( 3 'Iteam' => array( 4 'count' => '0', 5 'url' => "", 6 'image' => "" 7 ) 8 ), 9 array( 10 'Iteam' => array( 11 'count' => '1', 12 'url' => "/aaa", 13 'image' => "sample001.png" 14 ) 15 ), 16 array( 17 'Iteam' => array( 18 'count' => '1', 19 'url' => "/bbb", 20 'image' => "sample002.png" 21 ) 22 ) 23);

上記の例では、配列の要素が3つあるため、
・何も入っていません
・画像のリンク
・画像のリンク
と3回の出力が行われますが、それを勘違いされていませんか?

ちなみに、ideoneで動作するように多少ソースを修正していますが、以下のソースで
Success time: 0.02 memory: 52472 signal:0

<div>何も入っていません</div> <div>何か入っています</div> <a href=/aaa><img src=this->webrootsample001.png /></a> <br><p>Liked:1</p> <div>何か入っています</div> <a href=/bbb><img src=this->webrootsample002.png /></a> <br><p>Liked:1</p> と出力されるので、制御構造には問題がないと思います

PHP

1<?php 2 3// your code goes here 4$result = array ( 5 array( 6 'Iteam' => array( 7 'count' => '0', 8 'url' => "", 9 'image' => "" 10 ) 11 ), 12 array( 13 'Iteam' => array( 14 'count' => '1', 15 'url' => "/aaa", 16 'image' => "sample001.png" 17 ) 18 ), 19 array( 20 'Iteam' => array( 21 'count' => '1', 22 'url' => "/bbb", 23 'image' => "sample002.png" 24 ) 25 ) 26); 27 28foreach($result as $val): 29 if ($val['Iteam']['count'] == 0) : 30 echo "<div>何も入っていません</div>\n"; 31 else : 32 echo "<div>何か入っています</div>\n"; 33 echo "<a href=".$val["Iteam"]["url"]."><img src="."this->webroot".$val["Iteam"]["image"]." /></a>\n"; 34 echo "<br><p>Liked:".$val['Iteam']['count']."</p>\n"; 35 endif ; 36endforeach;

投稿2015/10/19 04:53

KatsumiTanaka

総合スコア924

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hyskyo

2015/10/19 07:43

ご回答ありがとうございます。 修正していただいたソースで試してみましたが何も入ってませんメッセージと一緒に画像が出てしまいます!! 説明不足で失礼しました。 countが一個入っていればコメントが非表示になって、countされたイメージが表示されますが逆にcountが一個も入ってなかったらまだ何も入っていませんのコメントが一行だけ表示されるようにしたいです。 多分よくある例だと思います。よろしくお願いします。 配列の要素は一つだけです。 ちなみに表示したい画像は何100くらいです。 よろしくお願いします
KatsumiTanaka

2015/10/19 08:00

やりたいことは、おおよそ想像ができるですが、配列の内容が分からないので、 ざっくりとしたイメージでコメントします 以下のように、配列をすべて回して、画像の登録があればそれを出力し、 出力した回数をカウントする (カウントではなく、フラグのON/OFFでも大丈夫だと思います) その後、ループを抜けた後で、1件も画像の登録がなければ、メッセージを 表示するというのでは、いかがでしょうか? $count = 0; foreach($result as $val): if ($val['Iteam']['count'] != 0) : echo "<div>何か入っています</div>\n"; echo "<a href=".$val["Iteam"]["url"]."><img src="."this->webroot".$val["Iteam"]["image"]." /></a>\n"; echo "<br><p>Liked:".$val['Iteam']['count']."</p>\n"; $count++; endif ; endforeach; if ($count == 0): echo "<div>何も入っていません</div>\n"; endif:
hyskyo

2015/10/19 12:01

ご提示のソースで動かしてみましたが なんかどうしても画像の下にコメントも出てしまいますね!!
KatsumiTanaka

2015/10/19 12:08

再度確認しますが、差支えのない範囲で、$result の配列の内容を教えて もらえませんか? 配列のダンプは、print_r($result)で行えます
hyskyo

2015/10/19 12:54

すみません、下記が全部です!!よろしくお願いします。 Array[Iteam, title, image_name, imega_url, url, number, created, updated]
KatsumiTanaka

2015/10/19 14:03

回答いただいた配列には、countの要素がありませんが、配列の要素の数によってcountの 有無が異なりますか?
hyskyo

2015/10/19 15:05

カウントは他のサーバーにあるAPIで取得してます!!ユーザーがボタンを押したら、それがカウントされて且つ画像と一緒に表示されます!!
KatsumiTanaka

2015/10/19 23:31

$result配列の中に、countとなるキーが存在しないのであれば、 if($val['Iteam']['count'] != 0) 自体が意味がないことになります 自分のサンプルコードにあるような形式で、$resultのダンプはできませんか?
hyskyo

2015/10/20 00:21

失礼いたしました。 抜けてました。配列の中にCountあります。
KatsumiTanaka

2015/10/20 01:55

サンプルのコードの制御構造が分かりづらかったので、少し手直しをしています (しかし、基本的な構造は変更していません) 以下のコードでは、1件でも$val['Iteam']['count'] != 0のレコードが存在すれば、 $countがtureに設定されてるため、ループを抜けた後のif文内のコードは実行されません 以下のコードでも、"<div>何も入っていません</div>"が表示されるのであれば、 別の個所に"<div>何も入っていません</div>"を表示するコードが含まれていることも 考えられます その場合は、例えば"<div>何も入っていません(Debug1)</div>"のように、出力 するメッセージを変更して、本当のこのメッセージが表示されていることを確認して みてください また、再度お願いしますが、サンプルで示しているように、$resultの連想配列の 構造が分かる形で、配列のダンプをお願いします $count = false; foreach($result as $val) { if ($val['Iteam']['count'] != 0) { echo "<a href=".$val["Iteam"]["url"]."><img src="."this->webroot".$val["Iteam"]["image"]." /></a>\n"; echo "<br><p>Liked:".$val['Iteam']['count']."</p>\n"; $count = true; } } if (!$count) { echo "<div>何も入っていません</div>\n"; }
hyskyo

2015/10/20 06:29

これで解決できました、ありがとうございました。
hyskyo

2015/10/23 07:10

これのカウント数一番多い順から順位1, 順位2, 順位3.....のようするには何をどう開けばいいですか?
KatsumiTanaka

2015/10/23 12:51

ベタな解決法ですが、自分なら出力するループ処理の前に、$resultを出力したい 順にソートしなおしておきます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問