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

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

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

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

2040閲覧

foreach内の繰り返し処理について

toll_tree

総合スコア199

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2019/05/03 01:56

編集2019/05/03 03:14

foreach内の配列をうまく回せません

php

1<?php 2 3include 'shop_class.php'; 4 5error_reporting(E_ALL); 6ini_set("display_errors",1); 7session_start(); 8if(!isset($_SESSION['id'])){ 9 header('Location:login.php'); 10} 11 12$shop = new Shop('mysql:host=localhost;dbname=ec_website','root','12345'); 13 14$user_id = intval($_SESSION['id']); 15if($_POST){ 16 // var_dump($_POST); 17 // exit(); 18 19 $product_name = $_POST['name']; 20 $img = $_POST['img']; 21 $price = $_POST['price']; 22 $product_id = intval($_POST['product_id']); 23 $item_check = $shop->cart_check($user_id,$product_id); 24 25 26 if(!$item_check){ 27 // try{ 28 $shop->add_select_item($user_id,$product_id); 29 // }catch(PDOException $e){ 30 // echo $e->getMessage(); 31 // } 32 33 echo __LINE__; 34 //exit(); 35 36 }else{ 37 $shop->update($product_id); 38 echo __LINE__; 39 //exit(); 40 } 41 42} 43 44$item_list = $shop->cart_list($user_id); 45//var_dump($item_list); 46//exit(); 47//exit(); 48// foreach($item_list as $item){ 49// //var_dump($item); 50// $item_info[] = $shop->cart_item_info($item['item_id']); 51// } 52//var_dump($item_info); 53 54foreach($item_list as $item){ 55 $item_info_list[] = $shop->item_info_list($item['item_id']); 56} 57 58var_dump($item_info_list); 59 60 61 62 63 64 65?> 66 67<!DOCTYPE html> 68<html lang="ja"> 69<head> 70 <meta charset="UTF-8"> 71 <link type="text/css" rel="stylesheet" href="./css/cart.css"> 72 <title>カートページ</title> 73</head> 74<body> 75 <header class="header_box"> 76 <a href="top.php"> 77 <img class="logo" src="./images/logo.png" alt="CodeShop"> 78 </a> 79 80 <p class="user_name"> 81 ユーザー名:<?php echo $_COOKIE['name']; ?> 82 </p> 83 <a href="cart.php"> 84 <img src="./images/cart.png"> 85 </a> 86 <a href="logout.php" class="logout"> 87 ログアウト 88 </a> 89 </header> 90 <div class="cart_content"> 91 <h3>ショッピングカート</h3> 92 <div class="product_list_title"> 93 <span class="product_list_price">価格</span> 94 <span class="product_list_num">数量</span> 95 </div> 96 <div class="product_list"> 97 <ul> 98 <?php foreach($item_info_list as $item_info): 99 foreach($item_list as $item_amount): 100 var_dump($item_amount['amount']); 101 102 ?> 103 104 <li> 105 <img src="<?=$item_info['img']?>" width="150px" height="100px"> 106 <span><?=$item_info['name']?></span> 107 <form action="cart.php" method="post"> 108 <input type="submit" value="削除"> 109 <input type="hidden" name="delete" value="1"> 110 </form> 111 <span><?=$item_info['price']?></span> 112 <form action="cart.php" method="post"> 113 <input type="text" name="quantity" value="<?=$item_amount['amount']?>"> 114 <input type="submit" value="変更する"> 115 </form> 116 117 </li> 118 <?php endforeach;?> 119 <?php endforeach;?> 120 121 122 </ul> 123 </div> 124 </div> 125 </body> 126 </html>

上記コードの、$item_info_listの中身が下記になります。
イメージ説明
上記コードを実行した結果が下記になります
イメージ説明
イメージ説明
イメージ説明
まだ、下にも画像は続きますが、上記画像のように同じ画像、名前、値段の情報を格納した、データが繰り返し表示されてしまっています。
このような現象が起こっている原因が分からないため、ご助言頂きたいです。
よろしくお願いします
追記です。
$item_listの中身は以下になります。
「array(4) { [0]=> array(2) { ["item_id"]=> int(13) ["amount"]=> int(22) } [1]=> array(2) { ["item_id"]=> int(15) ["amount"]=> int(2) } [2]=> array(2) { ["item_id"]=> int(17) ["amount"]=> int(1) } [3]=> array(2) { ["item_id"]=> int(14) ["amount"]=> int(2) } }」
$item_info_listをvar_exportした結果は以下の画像になります。
array ( 0 => array ( 'name' => 'テスト', 'price' => 100, 'img' => './images/f0ab631298df0117d17f6c91955a0be7129de339.jpg', ), 1 => array ( 'name' => 'test111', 'price' => 1000, 'img' => './images/4a60837fe9c460ed404f490ca86a61d7c936613b.jpg', ), 2 => array ( 'name' => 't-shirt2', 'price' => 1000, 'img' => './images/cccacab372172c1f63c1351d95df9e792fdd4002.jpg', ), 3 => array ( 'name' => 'test', 'price' => 1000, 'img' => './images/a482e68f5a960d0a2c47b8819a178b8b4f21c87c.jpg', ), )

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

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

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

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

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

m.ts10806

2019/05/03 02:52

var_dumpよりvar_exportの方がコードに組み込みやすい形で出力してくれるので再現確認したい回答側としてはそちらの方がありがたいです
toll_tree

2019/05/03 03:15

var_exportした結果を追記しました
guest

回答1

0

ベストアンサー

PHP

1 <div class="product_list"> 2 <ul> 3 <?php foreach($item_info_list as $item_info): // loop 1 4 foreach($item_list as $item_amount): // loop 2 5 var_dump($item_amount['amount']); 6 7 ?> 8 9 <li> 10 <img src="<?=$item_info['img']?>" width="150px" height="100px"> 11 <span><?=$item_info['name']?></span> 12 <form action="cart.php" method="post"> 13 <input type="submit" value="削除"> 14 <input type="hidden" name="delete" value="1"> 15 </form> 16 <span><?=$item_info['price']?></span> 17 <form action="cart.php" method="post"> 18 <input type="text" name="quantity" value="<?=$item_amount['amount']?>"> 19 <input type="submit" value="変更する"> 20 </form> 21 22 </li> 23 <?php endforeach;?> // loop 2 end 24 <?php endforeach;?> // loop 1 end 25 26 27 </ul> 28 </div>

分かりやすく、コメントを付けました。

loop2 の終端がおかしいですね?
これが本来は loop2 の2行後(var_dump() の直後)でないといけないのでは?


内容修正

$item_info_list と $item_list って、「別々の」リストになってるのですね。
それを二重ループさせれば当然こうなります。

で、困ったことに $item_info_list の n 番目と、$item_list の n 番目とが「同じものの情報を表している」かどうか、このコードからでは判断できません。おそらくそういう作りにしているのでしょうけれども、保証がないのです。

上記の前提であるとした上で考えるなら、

PHP

1 <div class="product_list"> 2 <ul> 3 <?php for($i = 0; $i < array_count($item_info_list); $i++) : ?> 4 <li> 5 <?php 6 $item_info = $item_info_list[$i]; 7 $item_amount = $item_list[$i] 8 ?> 9 <img src="<?=$item_info['img']?>" width="150px" height="100px"> 10 <span><?=$item_info['name']?></span> 11 <form action="cart.php" method="post"> 12 <input type="submit" value="削除"> 13 <input type="hidden" name="delete" value="1"> 14 </form> 15 <span><?=$item_info['price']?></span> 16 <form action="cart.php" method="post"> 17 <input type="text" name="quantity" value="<?=$item_amount['amount']?>"> 18 <input type="submit" value="変更する"> 19 </form> 20 21 </li> 22 <?php endfor;?> 23 </ul> 24 </div>

になるでしょうか。

投稿2019/05/03 02:02

編集2019/05/03 03:13
tacsheaven

総合スコア13703

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

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

toll_tree

2019/05/03 02:08

ご回答ありがとうございます。 ご指摘頂きました、「loop2 の終端」なのですが、loop2 の2行後に「endforeach」としてしまったら、 <input type="text" name="quantity" value="<?=$item_amount['amount']?>"> ここの部分で、$item_amount['amount']を使用できないと思うのですが、ここの部分については、いかがでしょうか?
tacsheaven

2019/05/03 02:19

どうもデータ構造が変なような……$item_info_list そのものはどんなデータになっていますか? ※item_info['name'] じゃなくて item_amount['name'] でないとおかしいような……
toll_tree

2019/05/03 02:27

「$item_info_list」の中身は質問内容に画像で貼らせて頂いています!
toll_tree

2019/05/03 02:32

$item_listの中身も質問本文に追記させて頂きました。
tacsheaven

2019/05/03 03:06 編集

んんん……? foreach を二重にしてるけど、多次元配列じゃないのかこれ。 $item_info_list と $item_amount を結びつける条件がないから、まともに動作させられませんね…… ※おそらく、$item_info_list の添え字と $item_amount の添え字が同一である、という前提なのでしょうが、それを保証するようなデータの取り方であることが保証できていない 上記のように添え字が同一であるという前提の元であれば、foreach ではなく for を一重ループで回して、その中で $item_info[$i] と $item_amount[$i] ($i は for のループカウンタ)を使うようにするしかないですね
toll_tree

2019/05/03 03:05

$item_amount['name'] はforeach内で使用していないのですが、$item_info['name']のことではないでしょうか?
toll_tree

2019/05/03 03:16

あ、そうなんですよね... foreachは2重にしているのですが、foreachの中身は別の配列にしています。
toll_tree

2019/05/03 03:20

foreachで回している2つの配列で、同じ添え字は使用していないと思うのですが、どこの部分でしょうか? foreach内の2つの配列で添え字が同じであるという条件は、考えていませんでした。
toll_tree

2019/05/03 03:23

$item_amountの要素数と、item_info['img']やitem_info['name']の数が、同じな為、そのような条件はforeach内では考えていなかったです
tacsheaven

2019/05/03 03:30

だから、「そもそも別のリスト」を二重ループで回しちゃ駄目なんですよ
toll_tree

2019/05/03 03:30

すみません。追記読ませて頂きました。 foreach内では、2重ループさせると、あのような現象になってしまうのですね... 別々の配列を回す時は、気をつけたいと思います...
toll_tree

2019/05/03 03:31

とりあえずは、追記頂いた内容で、試してみたいと思います
toll_tree

2019/05/03 03:34

追記頂いた内容で、array_countを使用されているのですが、関数がPHPマニュアルで見つからなかったのですが、count関数のことでしょうか?
toll_tree

2019/05/03 03:50

出来ました! ありがとうございました。配列は、foreachで回すものと思っていたのですが、for文でも今回のように回せるというのは、勉強になりました
tacsheaven

2019/05/03 04:45

array_count についてはその通りです。foreach だから、ではなく、そもそも今回の場合は二つの配列を二重ループで回すこと自体が間違いです。そこを理解できないとまったく意味がありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問