繁体   English   中英

Laravel PHP通过多个键值过滤多维数组

[英]Laravel PHP filter multidimensional array by multiple key values

我有一个看起来像这样的数组:

[
  [
    "type" => "dir",
    "path" => "vendor/test/test",
    "dirname" => "vendor/test",
    "basename" => "test",
    "filename" => "test",
  ],
  [
    "type" => "file",
    "path" => "vendor/test/test.html",
    "visibility" => "public",
    "size" => 0,
    "dirname" => "vendor/test",
    "basename" => "test.html",
    "extension" => "html",
    "filename" => "test",
  ],
   [
    "type" => "file",
    "path" => "vendor/test/test2.html",
    "visibility" => "public",
    "size" => 0,
    "dirname" => "vendor/test",
    "basename" => "test2.html",
    "extension" => "txt",
    "filename" => "test2",
  ]
]

我想只包含类型等于“文件”而扩展名等于“ html”的数组的数组

这是我到目前为止的内容,仅适用于1个过滤器

$filter = ['file'];
$contents = array_filter($contents, function ($event) use ($filter) {
    return in_array($event['type'], $filter);
});

如果我尝试在过滤器和in_array函数中放置多个值,则会抱怨。

如何使用2个过滤器?

您可以这样做:

$contents = array_filter($contents, function ($event) {
    return isset($event['type']) &&
        isset($event['extension']) &&
        $event['type'] === 'file' && 
        $event['extension'] === 'html';
});

您可以像这样简单地获取它:

$result = [];
foreach ($contents as $item) {
    if (in_array('type', $item)) {
        if ($item['type'] === 'file') {
            if (in_array('extension', $item)) {
                if ($item['extension'] === 'html') {
                    $result[] = $item;
                }
            }
        }
    }
}
// dd($result)

你可以试试看

// setting a filter for each key we want
$filters = ['extension'=>['html'],'type'=>['file','dir']];
$contents = array_filter($contents, function ($event) use ($filters) {
    // checking for each filter inside the associative array
    foreach($filters as $key => $filter){
       // assuming $key is type and $filter is file,dir 
       // if type isn't file or dir it'll remove the event from the contents
       if(!in_array($event[$key], $filter){
         return false;
       }
    }
    return true;
});

Laravel样式替代:

https://laravel.com/docs/5.8/helpers#method-array-where

$filtered = Arr::where($array, function ($value, $key) {
    return $value['type'] === 'file' && $value['extension'] === 'html';
});

你可以这样尝试:

$contents = array_filter($contents, function ($event){
    return $event['type']=='file' && $event['extension']=='html';
});

要么

   $filter=['file','html'];
   $contents = array_filter($contents, function ($event) use ($filter) {
        return $event['type']==$filter[0] && $event['extension']==$filter[1];
  });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM