请教一下,用laravel collect 如何过滤掉一组数组 ?

数据如下 :

$arr = [
    [
        'name' => 'Home',
        'rule' => 'home',
        'children' => [
            [
                'name' => 'index',
                'rule' => 'index',
            ],
            [
                'name' => 'show',
                'rule' => 'show',
            ]
        ],
    ],
    [
        'name' => 'File',
        'rule' => 'file',
        'children' => [
            [
                'name' => 'add',
                'rule' => 'add',
            ],
            [
                'name' => 'edit',
                'rule' => 'edit',
            ]
        ],
    ],
];

$rule = ['home', 'index', 'file', 'edit'];

目前我这样写,是有问题的,与期望的结果不符,

$collect = collect($arr)
    ->whereInStrict('rule', $rule)
    ->map(function ($value) use ($rule) {
       return collect($value['children'])->whereInStrict('rule', $rule);
    });

dump($collect->toArray());

打印出来的结果:

array:2 [▼
  0 => array:1 [▼
    0 => array:2 [▼
      "name" => "index"
      "rule" => "index"
    ]
  ]
  1 => array:1 [▼
    1 => array:2 [▼
      "name" => "edit"
      "rule" => "edit"
    ]
  ]
]

期望的结果应该为这样:

[
    'name' => 'Home',
    'rule' => 'home',
    'children' => [
        [
            'name' => 'index',
            'rule' => 'index',
        ]
    ],
    ],
    [
    'name' => 'File',
    'rule' => 'file',
    'children' => [
        [
            'name' => 'edit',
            'rule' => 'edit',
        ]
    ],
],

请问这个该如何写呢?

慕侠2389804
浏览 975回答 1
1回答

摇曳的蔷薇

兄弟,有个地方不对,你第二次筛选出来的结果应该赋值回去才对~你的代码: $collect = collect($arr) ->whereInStrict('rule', $rule) ->map(function ($value) use ($rule) { return collect($value['children'])->whereInStrict('rule', $rule); }); 修改: $collect = collect($arr) ->whereInStrict('rule', $rule) ->map(function ($value) use ($rule) { $value['children'] = collect($value['children'])->whereInStrict('rule', $rule) ->toArray(); //此处要赋值回去,而且要把结果转为数组 return $value; }); 这样的结果就是你想要的,总体思路没毛病~
打开App,查看更多内容
随时随地看视频慕课网APP