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

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

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

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

iteratorパターン

iteratorパターンとは、オブジェクト指向プログラミングのデザインパターンです。コンテナオブジェクトの要素を列挙する手段を独立させることによって、コンテナの内部仕様に依存しない反復子を提供することを目的とします。

CakePHP

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

Q&A

解決済

2回答

1464閲覧

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

GuSan

総合スコア19

foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

iteratorパターン

iteratorパターンとは、オブジェクト指向プログラミングのデザインパターンです。コンテナオブジェクトの要素を列挙する手段を独立させることによって、コンテナの内部仕様に依存しない反復子を提供することを目的とします。

CakePHP

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

0グッド

0クリップ

投稿2018/11/16 13:35

編集2018/11/16 13:41

前提

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

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

TimelineController

1 2<?php 3namespace App\Controller; 4 5use App\Controller\AppController; 6 7class TimelineController extends AppController 8{ 9 10 public function index() 11 { 12 13 $jointable = $this->Contents->find() 14 ->join([ 15 'table' => 'users', 16 'alias' => 'u', 17 'type' => 'INNER', 18 'conditions' => 'u.id = contents.userid', 19 ])->select([ 20 'id' => 'Contents.id', 21 'title' => 'Contents.title', 22 'body' => 'Contents.body', 23 'img' => 'Contents.img', 24 'category' => 'Contents.category', 25 'postname' => 'u.name', 26 'posticon' => 'u.icon', 27 'created' => 'Contents.created', 28 ]); 29 30 $contents = $this->paginate($jointable); 31 32 $myaccount = $this->Auth->user(); 33 34 $myid = $myaccount['id']; 35 36 //ログイン中のアカウントデータを取得 37 $user_data = $this->Users->find() 38 ->select([ 39 'icon' => 'users.icon', 40 'name' => 'users.name', 41 ])->where([ 42 'id' => $myid, 43 ])->first(); 44 45 $myname = $user_data->name; 46 $myicon = parent::display_img($user_data->icon,"20px","20px"); 47 48 foreach ($contents as &$content){ 49 $content->icon = parent::display_img($content->icon, "90%", ""); 50 } 51 52 53 $this->set(compact('contents', 'myname', 'myicon')); 54 } 55} 56

AppController

1<?php 2 3namespace App\Controller; 4 5use Cake\Controller\Controller; 6use Cake\Event\Event; 7use Cake\ORM\TableRegistry; 8 9class AppController extends Controller 10{ 11 12 public function initialize() 13 { 14 parent::initialize(); 15 16 17 $this->Users = TableRegistry::get("users"); 18 $this->Contents = TableRegistry::get("contents"); 19 20 $this->loadComponent('RequestHandler', [ 21 'enableBeforeRedirect' => false, 22 ]); 23 $this->loadComponent('Flash'); 24 25 $this->loadComponent('Auth', [ 26 'loginAction' => [ 27 'controller' => 'login' 28 ], 29 'loginRedirect' => [ 30 'controller' => 'timeline' 31 ], 32 'logoutRedirect' => [ 33 'controller' => 'login', 34 ], 35 'authenticate' => [ 36 'Form' => [ 37 'fields' => ['username' => 'email', 'password' => 'password'] 38 ] 39 ], 40 ]); 41 } 42 43 //フォームから受け取った画像配列データをbase64にして返す 44 public function img_64encode($getimg) 45 { 46 if ($getimg['size'] > 0) { 47 return base64_encode(file_get_contents($getimg['tmp_name'])); 48 } else { 49 return ""; 50 } 51 } 52 53 //DBから受け取ったsourceデータを開きimgタグとして返す 54 public function display_img($myicon,$width,$height) 55 { 56 if(is_null($myicon)){ 57 return ""; 58 } 59 $myiconsource = stream_get_contents($myicon); 60 if (mb_strlen($myiconsource) > 0) { 61 return "<img width='" . $width . "' height='" . $height . "' src='data:image/png;base64," . $myiconsource . "'>"; 62 } else { 63 return ""; 64 } 65 } 66 67 public function delete($id = null) 68 { 69 $this->request->allowMethod(['post', 'delete']); 70 $content = $this->Contents->get($id); 71 if ($this->Contents->delete($content)) { 72 $this->Flash->success(__('削除に成功しました。')); 73 } else { 74 $this->Flash->error(__('削除に失敗しました。もう一度実行してください。')); 75 } 76 return $this->redirect(['controller' => 'timeline']); 77 } 78 79} 80

index

1<nav class="navbar-collapse sidebar" id="actions-sidebar"> 2 <ul class="side-nav"> 3 <?= $myicon ?> 4 <?= "ようこそ" . $myname . "さん" ?> 5 <li><a href="<?= $this->Url->build(['controller' => 'mypage']) ?>">マイページ</a></li> 6 <li><a href="<?= $this->Url->build(['controller' => 'logout']) ?>">ログアウト</a></li> 7 <li><a href="<?= $this->Url->build(['controller' => 'ProfileEdit']) ?>">プロフィール編集</a></li> 8 <li><?= $this->Html->link(__('ホーム'), ['action' => 'index']) ?></li> 9 <li><?= $this->Html->link(__('新規作成'), ['controller' => 'NewContent']) ?></li> 10 </ul> 11</nav> 12 13<div class="contents index large-9 medium-8 columns content"> 14 15 <?php foreach ($contents as $content) : ?> 16 <div class="panel panel-default"> 17 <?= $content->postname . "さんの投稿" ?> 18 <div class="panel-heading"><?= h($content->title) ?></div> 19 <div class="panel-body"><?= nl2br(h($content->body)) ?></div> 20 21 <div class="panelimg"><?= $content->icon ?></div> 22 23 <div><?= $content->created ?></div> 24 25 <div class="ContentAction"> 26 <?= $this->Html->link(__('詳細'), ['action' => 'view', $content->id]) ?> 27 <?= $this->Html->link(__('編集'), ['action' => 'edit', $content->id]) ?> 28 <?= $this->Form->postLink(__('削除'), ['action' => 'delete', $content->id], ['confirm' => __("{0}を削除しますか?", $content->title)]) ?> 29 </div> 30 </div> 31 <?php endforeach; ?> 32 33 34 <div class="paginator"> 35 <ul class="pagination"> 36 <?= $this->Paginator->first('<< ' . __('最初')) ?> 37 <?= $this->Paginator->prev('< ' . __('前')) ?> 38 <?= $this->Paginator->numbers() ?> 39 <?= $this->Paginator->next(__('次') . ' >') ?> 40 <?= $this->Paginator->last(__('最後') . ' >>') ?> 41 </ul> 42 <p><?= $this->Paginator->counter(['format' => __('{{page}}/{{pages}}ページ 全{{count}}件')]) ?></p> 43 </div> 44</div> 45

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

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

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

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

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

guest

回答2

0

自己解決

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

投稿2018/11/16 17:38

GuSan

総合スコア19

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

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

0

そのままじゃないの?

php

1foreach ($contents as &$content){

でしょ。

投稿2018/11/16 13:43

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

GuSan

2018/11/16 13:48

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問