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

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

ただいまの
回答率

87.58%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 746

score 35

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

<?php

include 'shop_class.php';

error_reporting(E_ALL);
ini_set("display_errors",1);
session_start();
if(!isset($_SESSION['id'])){
  header('Location:login.php');
}

$shop = new Shop('mysql:host=localhost;dbname=ec_website','root','12345');

$user_id = intval($_SESSION['id']);
if($_POST){
  // var_dump($_POST);
  // exit();

  $product_name = $_POST['name'];
  $img = $_POST['img'];
  $price = $_POST['price'];
  $product_id = intval($_POST['product_id']);
  $item_check = $shop->cart_check($user_id,$product_id);


  if(!$item_check){
    // try{
      $shop->add_select_item($user_id,$product_id);
    // }catch(PDOException $e){
    //   echo $e->getMessage();
    // }

    echo __LINE__;
    //exit();

  }else{
    $shop->update($product_id);
    echo __LINE__;
    //exit();
  }

}

$item_list = $shop->cart_list($user_id);
//var_dump($item_list);
//exit();
//exit();
// foreach($item_list as $item){
//   //var_dump($item);
//   $item_info[] = $shop->cart_item_info($item['item_id']);
// }
//var_dump($item_info);

foreach($item_list as $item){
  $item_info_list[] = $shop->item_info_list($item['item_id']);
}

var_dump($item_info_list);






?>

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <link type="text/css" rel="stylesheet" href="./css/cart.css">
  <title>カートページ</title>
</head>
<body>
  <header class="header_box">
    <a href="top.php">
      <img class="logo" src="./images/logo.png" alt="CodeShop">
    </a>

    <p class="user_name">
      ユーザー名:<?php echo $_COOKIE['name']; ?>
    </p>
    <a href="cart.php">
      <img src="./images/cart.png">
    </a>
    <a href="logout.php" class="logout">
      ログアウト
    </a>
    </header>
    <div class="cart_content">
      <h3>ショッピングカート</h3>
      <div class="product_list_title">
        <span class="product_list_price">価格</span>
        <span class="product_list_num">数量</span>
      </div>
      <div class="product_list">
        <ul>
          <?php foreach($item_info_list as $item_info):
                foreach($item_list as $item_amount):
                  var_dump($item_amount['amount']);

                ?>

          <li>
            <img src="<?=$item_info['img']?>" width="150px" height="100px">
            <span><?=$item_info['name']?></span>
            <form action="cart.php" method="post">
              <input type="submit" value="削除">
              <input type="hidden" name="delete" value="1">
            </form>
            <span><?=$item_info['price']?></span>
            <form action="cart.php" method="post">
              <input type="text" name="quantity" value="<?=$item_amount['amount']?>">
              <input type="submit" value="変更する">
            </form>

          </li>
          <?php endforeach;?>
          <?php endforeach;?>


        </ul>
      </div>
    </div>
  </body>
  </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', ), )

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2019/05/03 11:52

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

    キャンセル

  • toll_tree

    2019/05/03 12:15

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

    キャンセル

回答 1

checkベストアンサー

+2

      <div class="product_list">
        <ul>
          <?php foreach($item_info_list as $item_info): // loop 1
                foreach($item_list as $item_amount):    // loop 2
                  var_dump($item_amount['amount']);

                ?>

          <li>
            <img src="<?=$item_info['img']?>" width="150px" height="100px">
            <span><?=$item_info['name']?></span>
            <form action="cart.php" method="post">
              <input type="submit" value="削除">
              <input type="hidden" name="delete" value="1">
            </form>
            <span><?=$item_info['price']?></span>
            <form action="cart.php" method="post">
              <input type="text" name="quantity" value="<?=$item_amount['amount']?>">
              <input type="submit" value="変更する">
            </form>

          </li>
          <?php endforeach;?>   // loop 2 end
          <?php endforeach;?>   // loop 1 end


        </ul>
      </div>


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

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


内容修正

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

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

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

      <div class="product_list">
        <ul>
          <?php for($i = 0; $i < array_count($item_info_list); $i++) : ?>
          <li>
            <?php
            $item_info = $item_info_list[$i];
            $item_amount = $item_list[$i]
            ?>
            <img src="<?=$item_info['img']?>" width="150px" height="100px">
            <span><?=$item_info['name']?></span>
            <form action="cart.php" method="post">
              <input type="submit" value="削除">
              <input type="hidden" name="delete" value="1">
            </form>
            <span><?=$item_info['price']?></span>
            <form action="cart.php" method="post">
              <input type="text" name="quantity" value="<?=$item_amount['amount']?>">
              <input type="submit" value="変更する">
            </form>

          </li>
          <?php endfor;?>
        </ul>
      </div>


になるでしょうか。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/05/03 12:34

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

    キャンセル

  • 2019/05/03 12:50

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

    キャンセル

  • 2019/05/03 13:45

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

    キャンセル

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

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

関連した質問

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