【问题标题】:Laravel - can't get values from multidimensional array with bladeLaravel - 无法使用刀片从多维数组中获取值
【发布时间】:2015-07-15 22:27:18
【问题描述】:

我在 laravel 中使用刀片循环遍历多维数组时遇到问题。我正在从控制器发送数据,如下所示:

return View::make('store.categories')
            ->with('brands', $brands);

如果我死了转储数据:

array (size=2)
  0 => 
    array (size=2)
      0 => string 'Fender' (length=6)
      1 => string '(2)' (length=3)
  1 => 
    array (size=2)
      0 => string 'Gibson' (length=6)
      1 => string '(1)' (length=3)

我尝试使用两个 @foreach 循环,但无法正常工作:

@foreach($brands as $brand)
  @foreach($brand as $b)
  {{$b}}
  @endforeach
@endforeach

上面会输出:Fender (2) Gibson (1)


我试图让$b 的0 值输出Fender,但它只是为$b 数组中的每个项目打印0 位置字符:
@foreach($brands as $brand)
  @foreach($brand as $b)
  {{$b[0]}}
  @endforeach    
@endforeach

上面会输出F ( G (


如果我这样做,在我的控制器中:

foreach ($brands as $b) {
    foreach($b as $key=>$v) {
       dd($v);
    }
}

它将输出string 'Fender' (length=6),这似乎是第一个@foreach 中的第二个循环有效。虽然,当涉及到上面提到的刀片代码时,它没有。

我可能做错了什么。如何分别获取嵌套数组的值 0 和 1 的输出?非常感谢任何帮助。


这就是我在控制器函数中创建数据的方式:

$products = Product::with('brand')->whereIn('category_id', $children->lists('id'));
$brand_ids = array();
$brands = array();

foreach ($products->get() as $p) {
    $brand_ids[] = $p->brand_id;
}
$brand_count = array_count_values($brand_ids); 
foreach ($brand_count as $key=>$value) {
    $query = Brand::where('id', '=', $key)->lists('name');
    // dd($query);
    foreach($query as $key=>$name) {
        $array = array(
             $name,
             '('.$value.')'
            );
        $brands[] = $array;
    }
}

【问题讨论】:

  • 使用 dd 并不能证明它有效。 dd 结束执行,如果你使用两个 foreachs,你仍然会得到四个字符串,而不是你之后的两个字符串(Fender 和 Gibson)。
  • 是的,你只需要一个 foreach。问题是为什么它在视图中显示为[
  • 我用来生成brands 数据的方式有问题吗?
  • @cchacholiades 你想要的输出是什么?你想在刀片中生成什么?
  • 对不起@PawelBieszczad 我正在尝试访问品牌array 位置01,例如它第一次循环{{b[0]}} 输出Fenderb[1] 输出(2),第二次{{b[0]}}输出Gibsonb[1]输出(1)

标签: php arrays laravel blade


【解决方案1】:
@foreach($brands as $brand)
  {{$brand[0]}}
@endforeach

您需要查看数组的组织方式。一旦你深入到第一层,'Fender' 的偏移量是[0],而'(2)' 的偏移量是[1],所以你只需要一个 foreach。

你得到F的原因是你得到了string'Fender'(或者换句话说,第一个字母)上的偏移量[0],因为第二个foreach带来了你是四个字符串,而不是数组。

$brands = [
  0 => 
    [
      0 => 'Fender',
      1 => '(2)'
    ],
  1 => 
    [
      0 => 'Gibson',
      1 => '(1)'
    ]
];

var_dump($brands);

foreach($brands as $brand) {
  echo $brand[0]."\n";
}

输出:

array(2) {
  [0]=>
  array(2) {
    [0]=>
    string(6) "Fender"
    [1]=>
    string(3) "(2)"
  }
  [1]=>
  array(2) {
    [0]=>
    string(6) "Gibson"
    [1]=>
    string(3) "(1)"
  }
}
Fender
Gibson

【讨论】:

  • 感谢您的回复。我试过了,它返回:[ [
  • 鉴于现有数据,我不明白这怎么可能。
  • 我没有任何 Laravel 设置来测试它,但 PHP 已在我的编辑中得到验证。
  • 使用您的确切代码添加更新,并在 foreach 中转储 $brand。
【解决方案2】:

控制器

$brands = Brand::whereIn('id', $brand_ids)->lists('name', 'id');

刀片

@foreach($brands as $id => $brand)
    Id: {{$id}}, Brand: {{$brand}}
@endforeach

这应该会起作用并节省您的性能,因为我们会查询所有品牌,而不是单独查询每个品牌。更好的方法是建立产品关系并以这种方式获取它们。

【讨论】:

    【解决方案3】:

    既然你想得到多维数组的第二级值,而且如果你知道第二级只有两个值,那你为什么不试试

    @foreach($brands as $brand) 
        {{$brand[0]}} {{$brand[1]}}
    @endforeach 
    

    【讨论】:

      猜你喜欢
      • 2017-09-15
      • 1970-01-01
      • 1970-01-01
      • 2020-12-02
      • 1970-01-01
      • 2020-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多