[英]Laravel PHP filter multidimensional array by multiple key values
I have an array that looks like this: 我有一个看起来像这样的数组:
[
[
"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",
]
]
I want to have an array with only the arrays where type equals "file" and extension equals "html" 我想只包含类型等于“文件”而扩展名等于“ html”的数组的数组
This is what I have so far and works great for 1 filter only 这是我到目前为止的内容,仅适用于1个过滤器
$filter = ['file'];
$contents = array_filter($contents, function ($event) use ($filter) {
return in_array($event['type'], $filter);
});
If I try to put multiple values in the filter and in the in_array function it complains. 如果我尝试在过滤器和in_array函数中放置多个值,则会抱怨。
How can I use 2 filters? 如何使用2个过滤器?
You can do it like this: 您可以这样做:
$contents = array_filter($contents, function ($event) {
return isset($event['type']) &&
isset($event['extension']) &&
$event['type'] === 'file' &&
$event['extension'] === 'html';
});
You can simply get it like this: 您可以像这样简单地获取它:
$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)
you can try this 你可以试试看
// 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 style alternative: Laravel样式替代:
https://laravel.com/docs/5.8/helpers#method-array-where https://laravel.com/docs/5.8/helpers#method-array-where
$filtered = Arr::where($array, function ($value, $key) {
return $value['type'] === 'file' && $value['extension'] === 'html';
});
you can try this way : 你可以这样尝试:
$contents = array_filter($contents, function ($event){
return $event['type']=='file' && $event['extension']=='html';
});
or 要么
$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.