鍍金池/ 問答/PHP/ 請教一下,用laravel collect 如何過濾掉一組數組 ?

請教一下,用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',
        ]
    ],
],

請問這個該如何寫呢?

回答
編輯回答
咕嚕嚕

兄弟,有個地方不對,你第二次篩選出來的結果應該賦值回去才對~
你的代碼:

$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;
});

這樣的結果就是你想要的,總體思路沒毛病~

2018年6月16日 04:46