使用来自另一个多维数组的多个规则过滤多维数组



我有一个多维输入数组和另一个包含用于过滤输入数组的规则的多维数组。

$array = [
    'tableData' => [
        [
            'booking_name' => 'abc/xyz/123',
            'pdg' => 'assure',
            'user_area' => 'es st',
            'release' => 'oss72',
            'start_date' => '2017-06-20 00:00:00',
            'end_date' => '2017-06-23 00:00:00',
            'asset_info' => [
                [
                    'status' => 10,
                    'manufacturer' => 'HP',
                    'model' => 'HP BL460C GEN8',
                    'hardware_color' => ''#0066b3'
                ]
            ],
            'full_name' => 'Valay Desai',
            'email_address' => 'valay@xyz.com'
        ],
        [
            'booking_name' => 'abc/xyz/123',
            'pdg' => 'assure',
            'user_area' => 'ls reca',
            'release' => 'oss72',
            'start_date' => '2017-06-20 00:00:00',
            'end_date' => '2017-06-23 00:00:00',
            'asset_info' => [
                [
                    'status' => 10,
                    'manufacturer' => 'SUN',
                    'model' => 'SUN GEN8',
                    'hardware_color' => '#0066b3'
                ]
            ],
            'full_name' => 'Chako Desai',
            'email_address' => 'chako@xyz.com'
        ]
    ]
];
$filterBy = [
    'booking_name' => 'abc',
    'pdg' => [
        ['name' => 'Invalid', 'value' => 'Invalid'],
        ['name' => 'assure', 'value' => 'assure']
    ],
    'user_area' => [
        ['name' => 'es st', 'value' => 'es st'],
        ['name' => 'Invalid', 'value' => 'Invalid'],
        ['name' => 'a&o', 'value' => 'a&o']
    ]
];

我知道array_filter可以用于比较值,但是我不确定如何在tableData中的数据上执行多规则过滤。

理想的输出应该是tableData的第一个元素,因为它具有booking_name=abcpdg=assureuser_area=es st

我尝试了:

// bigarray is an originial array to be filtered
// filterObj is an array with multiple filter conditions
array_filter($bigarray, function ($val_array) use ($filterObj) {
    $intersection = array_intersect_assoc($val_array, $filterObj);
    return (count($intersection)) === count($filterObj);
});

这总是返回空白数组。

更新1:

我使用以下方法来获取具有visible:true的对象。在问的问题上尝试了类似的尝试,但无法获得理想的结果。

$columnVisible = array(
    'visible' => 1,
);
$visibleColumns = array_filter($passedColumns, function ($val_array) use ($columnVisible) {
    $intersection = array_intersect_assoc($val_array, $columnVisible);
    return (count($intersection)) === count($columnVisible);
});

如何应用多个过滤条件作为数组数组的数组在数组的数组中传递?

尝试此解决方案。

$filters = array('pdg'=>array('xyzabc'), 'user_area'=>array('ls reca'));
$filter_items = array();
foreach( $items['tableData'] as $item ){
    $i=0;
    $is_match = true;

 foreach( $filters as $key=>$value){
    //$is_match = true;
    if( !in_array( $item[$key], $value) ){
        $is_match = false;
        break;
    }
    //$is_match = true;
 }
 if( $is_match ){
    $filter_items[] = $item;
 }
}

我不认为我会为此任务争吵 array_intersect()-函数。这些函数在迭代时执行排序,并且在保留/失败类型评估时,这将不是理想的。

我将简化过滤数组的结构,以使处理更加直接。pdguser_area规则将其扁平化为最有意义的部分后,只需致电array_filter()并在单个返回中写下三个评估。这将享受"短路"的性能优势。因此,一旦遇到false结果,false就会在不进行不必要的额外评估的情况下返回。

我将输出嵌套在tableData的内部,尽管我不知道这是您想要的确切输出。从元素解开过滤的数组很简单。

代码:(演示(

$filterBy['pdg'] = array_column($filterBy['pdg'], 'value');
$filterBy['user_area'] = array_column($filterBy['user_area'], 'value');
var_export(
    [
        'tableData' => 
        array_filter(
            $array['tableData'],
            function($row) use($filterBy) {
                return str_contains($row['booking_name'], $filterBy['booking_name'])
                    && in_array($row['pdg'], $filterBy['pdg'])
                    && in_array($row['user_area'], $filterBy['user_area']);
            }
        )
    ]
);

最新更新