【问题标题】:How do I use the multidimensional array in foreach?如何在 foreach 中使用多维数组?
【发布时间】:2017-04-26 07:12:27
【问题描述】:

我有一个数组$cart

array:1 [
  "product" => array:5 [
      "product_id" => array:2 [
      0 => 2
      1 => 6
    ]
    "product_name" => array:2 [
      0 => "HP Core i3 5th Gen - (4 GB/1 TB HDD/DOS) X5Q17PA 15-be005TU Notebook  (15.6 inch, Turbo SIlver, 2.19 kg)"
      1 => "SAMSUNG 55.88cm (22) Full HD LED TV  (UA22F5100AR, 2 x HDMI, 2 x USB)"
    ]
    "product_description" => array:2 [
      0 => "HP Core i3 5th Gen - (4 GB/1 TB HDD/DOS) X5Q17PA 15-be005TU Notebook  (15.6 inch, Turbo SIlver, 2.19 kg)HP Core i3 5th Gen - (4 GB/1 TB HDD/DOS) X5Q17PA 15-be005TU Notebook  (15.6 inch, Turbo SIlver, 2.19 kg)"
      1 => "SAMSUNG 55.88cm (22) Full HD LED TV  (UA22F5100AR, 2 x HDMI, 2 x USB)"
    ]
    "product_image" => array:2 [
      0 => "1481116344.jpeg"
      1 => "1481180186.jpeg"
    ]
    "product_price" => array:2 [
      0 => 350
      1 => 200
    ]
  ]
]

我的购物车页面是这样的:

@foreach()
<div class="row">
  <div class="col-md-2 col-xs-12">
    <img class="img-responsive" src="{{asset('images/150x70.png')}}">
  </div>
  <div class="col-md-4 col-xs-12">
    <h4><strong>Product Name</strong></h4>
    <h4><small>Product Body</small></h4>
  </div>
  <div class="col-md-6 col-xs-12">
    <div class="col-md-6 text-right">
     <h4><strong>$ Price</strong> x</h4>
    </div>
    <div class="col-md-4 col-xs-9">
     <input type="text" class="form-control input-sm" placeholder="quantity">
    </div>
    <div class="col-md-2 col-xs-2">
     <button class="btn btn-danger btn-sm"><span class="glyphicon glyphicon-trash"></span></button>
    </div>
  </div>
</div>
<hr>    
@endforeach

输出看起来像

如何在这段代码中向多维数组值发送垃圾邮件。假设有 3 个产品,那么应该有 3 行。

由于 product_name 和 product_description 是不同的数组,我无法创建总行数保持为 2 的 foreach,但它会为行发送正确的名称和正文。

注意:我在 Laravel 框架中编码,这就是为什么 foreach 语法看起来不同的原因。

谢谢!

【问题讨论】:

  • 如果您可以控制此处显示的数组格式,我建议您重新映射您的数组,以便每个元素包含单个产品而不是当前设置,这应该会让您的生活变得更加轻松
  • 同意,您的购物车应该有一系列产品,每个产品都有自己的属性,而不会被其他人注意到。在某些时候,您的产品可能允许客户更改颜色,而其他产品则不允许,这种方法很简单,但很快就会失败。
  • 我只是在评论进一步同意 haxxton 和 deligtedd0d,您的产品数组应该是包含特定产品的所有重要信息的 3 个子数组的数组。你现在如何得到它只会让你头疼。

标签: php laravel foreach


【解决方案1】:

使用@for() 遍历数组:

@for ($i = 0; $i < count($cart['product']['product_id']); $i++)
    <div class="row">
       <div class="col-md-2 col-xs-12">
           <img class="img-responsive" src="{{ asset('images/150x70.png') }}">
       </div>
       <div class="col-md-4 col-xs-12">
           <h4><strong>{{ $card['product']['product_name'][$i] }}</strong></h4>
           <h4><small>{{ $card['product']['product_description'][$i] }}</small></h4>
       </div>
       <div class="col-md-6 col-xs-12">
           <div class="col-md-6 text-right">
           <h4><strong>$ {{ $card['product']['product_price'][$i] }}</strong> x</h4>
           </div>
           <div class="col-md-4 col-xs-9">
               <input type="text" class="form-control input-sm" placeholder="quantity">
            </div>
            <div class="col-md-2 col-xs-2">
            <button class="btn btn-danger btn-sm"><span class="glyphicon glyphicon-trash"></span></button>
            </div>
        </div>
    </div>
    <hr>    
@endfor

【讨论】:

  • 我收到错误htmlspecialchars() expects parameter 1 to be string, array given
  • 我忘了添加$i 索引。现已修复。
  • 谢谢!有用!你帮我解决了我所有的 laravel 问题:)
  • 这行得通,并且准确地回答了您的问题。 +1。也就是说,你真的应该重新设计你的格式。请注意这个(完美的工作方法)和我在下面展示的方法之间的可读性差异。阵列和刀片模板一目了然。未来可维护性的差异现在非常值得您花时间;)
  • @DelightedD0D 我同意这似乎更复杂。
【解决方案2】:

我会像这样重新格式化输入,但您需要的是 @foreach($products as $product) $products 是您当前的变量。

如果您不想更改输入的格式(真的,我推荐它)使用 Alexey Mezenin 的答案

$products = [
    ['id' => '2',
        'name' => 'HP Core i3 5th Gen - (4 GB/1 TB HDD/DOS) X5Q17PA 15-be005TU Notebook  (15.6 inch, Turbo SIlver, 2.19 kg)',
        'description' => 'SAMSUNG 55.88cm (22) Full HD LED TV  (UA22F5100AR, 2 x HDMI, 2 x USB)',
        'image' => '1481116344.jpeg',
        'price' => '350',
    ],
    ['id' => '6',
        'name' => 'HP Core i3 5th Gen - (4 GB/1 TB HDD/DOS) X5Q17PA 15-be005TU Notebook  (15.6 inch, Turbo SIlver, 2.19 kg)HP Core i3 5th Gen - (4 GB/1 TB HDD/DOS) X5Q17PA 15-be005TU Notebook  (15.6 inch, Turbo SIlver, 2.19 kg)',
        'description' => 'SAMSUNG 55.88cm (22) Full HD LED TV  (UA22F5100AR, 2 x HDMI, 2 x USB)',
        'image' => '1481116344.jpeg',
        'price' => '200',
    ]
];



@foreach($products as $product)
    <div class="row">
        <div class="col-md-2 col-xs-12">
            <img class="img-responsive" src="{{asset($product['image'])}}">
        </div>
        <div class="col-md-4 col-xs-12">
            <h4><strong>{{$product['name']}}</strong></h4>
            <h4><small>{{$product['description']}}</small></h4>
        </div>
        <div class="col-md-6 col-xs-12">
            <div class="col-md-6 text-right">
                <h4><strong>${{$product['price']}}</strong> x</h4>
            </div>
            <div class="col-md-4 col-xs-9">
                <input type="text" class="form-control input-sm" placeholder="quantity">
            </div>
            <div class="col-md-2 col-xs-2">
                <button class="btn btn-danger btn-sm"><span class="glyphicon glyphicon-trash"></span></button>
            </div>
        </div>
    </div>
    <hr>
@endforeach

【讨论】:

    【解决方案3】:

    如果product_idproduct 数组的一致字段,则可以将其长度用作迭代器计数来对其他键执行查找。 警告这假定您用于输出到模板的所有键的长度都与product_id 相同,并且每个键中的每个索引都指向同一个产品。

    您似乎没有quantity 的密钥,所以没有填写该字段

    <?php for ($i = 0; $i <= count($cart['product']['product_id']); $i++): ?>
        <div class="row">
          <div class="col-md-2 col-xs-12">
            <img class="img-responsive" src="<?php echo $cart['product']['product_image'][$i]; ?>">
          </div>
          <div class="col-md-4 col-xs-12">
            <h4><strong><?php echo $cart['product']['product_name'][$i]; ?></strong></h4>
            <h4><small><?php echo $cart['product']['product_description'][$i]; ?></small></h4>
          </div>
          <div class="col-md-6 col-xs-12">
            <div class="col-md-6 text-right">
             <h4><strong>$ <?php echo $cart['product']['product_price'][$i]; ?></strong> x</h4>
            </div>
            <div class="col-md-4 col-xs-9">
             <input type="text" class="form-control input-sm" placeholder="quantity">
            </div>
            <div class="col-md-2 col-xs-2">
             <button class="btn btn-danger btn-sm"><span class="glyphicon glyphicon-trash"></span></button>
            </div>
          </div>
        </div>
        <hr>    
    <?php endfor ?>
    

    附言。不幸的是我不熟悉 Laravel 语法,所以这是标准的PHP


    编辑

    因为我不适合使用这种格式,所以我创建了一个转换器函数,应该将你的数组变成更易于管理的东西

    <?php 
    
    function convertCartArray($cart){
        // create new container array
        $products = array();
        // create array of all the keys in the old cart that you wish to convert
        $keys = array('product_id', 'product_name', 'product_description', 'product_image', 'product_price');
        // for each product
        for ($i = 0; $i < count($cart['product']['product_id']); $i++){
            // create a new product array
            $product = array();
            // for each of the keys
            for ($j = 0; $j < count($keys); $j++){
                // convert old cart product detail over to product detail
                $product[$keys[$j]] = $cart['product']$keys[$j][$i];
            }
            // add product to productsArray
            array_push($products, $product);
        }
        // return new products array
        return $products;
    }
    
    $productsArray = convertCartArray($cart);
    
    for ($i = 0; $i <= count($productsArray); $i++): ?>
        <div class="row">
          <div class="col-md-2 col-xs-12">
            <img class="img-responsive" src="<?php echo $productsArray[$i]['product_image']; ?>">
          </div>
          <div class="col-md-4 col-xs-12">
            <h4><strong><?php echo $productsArray[$i]['product_name']; ?></strong></h4>
            <h4><small><?php echo $productsArray[$i]['product_description']; ?></small></h4>
          </div>
          <div class="col-md-6 col-xs-12">
            <div class="col-md-6 text-right">
             <h4><strong>$ <?php echo $productsArray[$i]['product_price']; ?></strong> x</h4>
            </div>
            <div class="col-md-4 col-xs-9">
             <input type="text" class="form-control input-sm" placeholder="quantity">
            </div>
            <div class="col-md-2 col-xs-2">
             <button class="btn btn-danger btn-sm"><span class="glyphicon glyphicon-trash"></span></button>
            </div>
          </div>
        </div>
        <hr>    
    <?php endfor ?>
    

    【讨论】:

    • 变量 $cart 由具有“product_id”的产品数组组成。所以当我运行这个 for 循环时,我得到错误 Undefined variable: product
    • 基本上 $cart->product->product id 所以我不能直接使用 product 来处理这个?
    • @Phoenix,更新为使用$cart['product'] 而不是$product
    • @Phoenix,添加了新的转换器功能,将$cart 转换为$products
    • 谢谢,但有人已经提供了一种更简单的方法。感谢您的努力和时间。
    猜你喜欢
    • 2023-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    • 2016-02-01
    • 1970-01-01
    • 2012-08-14
    • 2013-11-02
    相关资源
    最近更新 更多