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

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

ただいまの
回答率

88.58%

イテレーターに対してのforeach

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,305

GuSan

score 19

 前提

CakePHP3を使用したWebアプリケーションの製作で
DBから取り出した画像への処理について困っているのでご教授いただきたいです。
イテレーターが理解できなかった為か
エラーメッセージからは解決策を導き出すことができませんでした。

アプリケーションの特徴 

  • Twitterに似ている
  • 投稿ごとに画像があったりなかったりする

 発生している問題

Controllerで取得したDBのデータに対し
レコード毎の画像フィールドに対してに
画像がある場合にはimgタグに置き換える、ない場合には""に置き換える
といった処理を行いたいと思っております。
それを実現する為Controller側でデータに対してforeachで
中身を一つずつ判定し置き換えようとしました。

しかし下記のようなエラーが発生いたしました。

An iterator cannot be used with foreach by reference

Error in: ROOT/src/Controller/TimelineController.php, line 48

 今回の処理で主に使っているファイル

<?php
namespace App\Controller;

use App\Controller\AppController;

class TimelineController extends AppController
{

    public function index()
    {

        $jointable = $this->Contents->find()
            ->join([
                'table' => 'users',
                'alias' => 'u',
                'type' => 'INNER',
                'conditions' => 'u.id = contents.userid',
            ])->select([
                'id' => 'Contents.id',
                'title' => 'Contents.title',
                'body' => 'Contents.body',
                'img' => 'Contents.img',
                'category' => 'Contents.category',
                'postname' => 'u.name',
                'posticon' => 'u.icon',
                'created' => 'Contents.created',
            ]);

        $contents = $this->paginate($jointable);

        $myaccount = $this->Auth->user();

        $myid = $myaccount['id'];

        //ログイン中のアカウントデータを取得
        $user_data = $this->Users->find()
            ->select([
                'icon' => 'users.icon',
                'name' => 'users.name',
            ])->where([
                'id' => $myid,
            ])->first();

            $myname = $user_data->name;
            $myicon = parent::display_img($user_data->icon,"20px","20px");

            foreach ($contents as &$content){
                $content->icon = parent::display_img($content->icon, "90%", "");
            }


        $this->set(compact('contents', 'myname', 'myicon'));
    }
}
<?php

namespace App\Controller;

use Cake\Controller\Controller;
use Cake\Event\Event;
use Cake\ORM\TableRegistry;

class AppController extends Controller
{

    public function initialize()
    {
        parent::initialize();


        $this->Users = TableRegistry::get("users");
        $this->Contents = TableRegistry::get("contents");

        $this->loadComponent('RequestHandler', [
            'enableBeforeRedirect' => false,
        ]);
        $this->loadComponent('Flash');

        $this->loadComponent('Auth', [
            'loginAction' => [
                'controller' => 'login'
            ],
            'loginRedirect' => [
                'controller' => 'timeline'
            ],
            'logoutRedirect' => [
                'controller' => 'login',
            ],
            'authenticate' => [
                'Form' => [
                    'fields' => ['username' => 'email', 'password' => 'password']
                ]
            ],
        ]);
    }

    //フォームから受け取った画像配列データをbase64にして返す
    public function img_64encode($getimg)
    {
        if ($getimg['size'] > 0) {
            return base64_encode(file_get_contents($getimg['tmp_name']));
        } else {
            return "";
        }
    }

    //DBから受け取ったsourceデータを開きimgタグとして返す
    public function display_img($myicon,$width,$height)
    {
        if(is_null($myicon)){
            return "";
        }
        $myiconsource = stream_get_contents($myicon);
        if (mb_strlen($myiconsource) > 0) {
            return "<img width='" . $width . "' height='" . $height . "' src='data:image/png;base64," . $myiconsource . "'>";
        } else {
            return "";
        }
    }

    public function delete($id = null)
    {
        $this->request->allowMethod(['post', 'delete']);
        $content = $this->Contents->get($id);
        if ($this->Contents->delete($content)) {
            $this->Flash->success(__('削除に成功しました。'));
        } else {
            $this->Flash->error(__('削除に失敗しました。もう一度実行してください。'));
        }
        return $this->redirect(['controller' => 'timeline']);
    }

}
<nav class="navbar-collapse sidebar" id="actions-sidebar">
    <ul class="side-nav">
        <?= $myicon ?>
        <?= "ようこそ" . $myname . "さん" ?>
        <li><a href="<?= $this->Url->build(['controller' => 'mypage']) ?>">マイページ</a></li>
        <li><a href="<?= $this->Url->build(['controller' => 'logout']) ?>">ログアウト</a></li>
        <li><a href="<?= $this->Url->build(['controller' => 'ProfileEdit']) ?>">プロフィール編集</a></li>
        <li><?= $this->Html->link(__('ホーム'), ['action' => 'index']) ?></li>
        <li><?= $this->Html->link(__('新規作成'), ['controller' => 'NewContent']) ?></li>
    </ul>
</nav>

<div class="contents index large-9 medium-8 columns content">

        <?php foreach ($contents as $content) : ?>
            <div class="panel panel-default">
                <?= $content->postname . "さんの投稿" ?>
                <div class="panel-heading"><?= h($content->title) ?></div>
                <div class="panel-body"><?= nl2br(h($content->body)) ?></div>

                <div class="panelimg"><?= $content->icon ?></div>

                <div><?= $content->created ?></div>

                <div class="ContentAction">
                    <?= $this->Html->link(__('詳細'), ['action' => 'view', $content->id]) ?>
                    <?= $this->Html->link(__('編集'), ['action' => 'edit', $content->id]) ?>
                    <?= $this->Form->postLink(__('削除'), ['action' => 'delete', $content->id], ['confirm' => __("{0}を削除しますか?", $content->title)]) ?>
                </div>
            </div>
        <?php endforeach; ?>


    <div class="paginator">
        <ul class="pagination">
            <?= $this->Paginator->first('<< ' . __('最初')) ?>
            <?= $this->Paginator->prev('< ' . __('前')) ?>
            <?= $this->Paginator->numbers() ?>
            <?= $this->Paginator->next(__('次') . ' >') ?>
            <?= $this->Paginator->last(__('最後') . ' >>') ?>
        </ul>
        <p><?= $this->Paginator->counter(['format' => __('{{page}}/{{pages}}ページ 全{{count}}')]) ?></p>
    </div>
</div>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

0

$content->icon ではなく $content->img でした...

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

そのままじゃないの?

foreach ($contents as &$content){

でしょ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/16 22:48

    レコード毎に処理するためにはどのように改善すればよろしいでしょうか。

    キャンセル

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

  • ただいまの回答率 88.58%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る