简体   繁体   中英

PHP array_filter is returning only last found value

I have this PHP code...

$filters = array(
    'AND' => array(
        array('col_name' => 'a', 'filter_value' => 'm', 'filter_oper' => '='),
        array('col_name' => 'b', 'filter_value' => 'n', 'filter_oper' => '='),
        array('col_name' => 'c', 'filter_value' => 'o', 'filter_oper' => '=')
    ),
    'OR' => array(
        array('col_name' => 'd', 'filter_value' => 'p', 'filter_oper' => '='),
        array('col_name' => 'e', 'filter_value' => 'q', 'filter_oper' => '='),
        array('col_name' => 'f', 'filter_value' => 'm', 'filter_oper' => '=')
    ),
    'AND' => array(
        array('col_name' => 'g', 'filter_value' => 'r', 'filter_oper' => '='),
        array('col_name' => 'h', 'filter_value' => 's', 'filter_oper' => '='),
        array('col_name' => 'i', 'filter_value' => 't', 'filter_oper' => '=')
    ),
    'OR' => array(
        array('col_name' => 'j', 'filter_value' => 'u', 'filter_oper' => '='),
        array('col_name' => 'k', 'filter_value' => 'v', 'filter_oper' => '='),
        array('col_name' => 'l', 'filter_value' => 'w', 'filter_oper' => '=')
    ),
);

print_r(array_filter($filters, function($oper) { return $oper == 'AND'; }, ARRAY_FILTER_USE_KEY));

What I want is to filter out from the $filters array, all rows with the AND key, but the output I'm getting is this, which obviously is the last found element...

Array ( 
    [AND] => Array ( 
        [0] => Array ( [col_name] => g [filter_value] => r [filter_oper] => = ) 
        [1] => Array ( [col_name] => h [filter_value] => s [filter_oper] => = ) 
        [2] => Array ( [col_name] => i [filter_value] => t [filter_oper] => = ) 
    ) 
)

What am I doing wrong?

The $filter you defined is a dictionary. You have declared "AND" and "OR" key twice which is ambiguous.

type print_r($filter); before your array_filter will show...

Array
(
    [AND] => Array
        (
            [0] => Array
                (
                    [col_name] => g
                    [filter_value] => r
                    [filter_oper] => =
                )

            [1] => Array
                (
                    [col_name] => h
                    [filter_value] => s
                    [filter_oper] => =
                )

            [2] => Array
                (
                    [col_name] => i
                    [filter_value] => t
                    [filter_oper] => =
                )

        )

    [OR] => Array
        (
            [0] => Array
                (
                    [col_name] => j
                    [filter_value] => u
                    [filter_oper] => =
                )

            [1] => Array
                (
                    [col_name] => k
                    [filter_value] => v
                    [filter_oper] => =
                )

            [2] => Array
                (
                    [col_name] => l
                    [filter_value] => w
                    [filter_oper] => =
                )

        )

)

The array(dictionary) only has two elements. If you want the array to be a 4-element array, for example, you could define as:

$filters = array(
    array(
        'key' => 'AND',
        'data' => array(
            array('col_name' => 'a', 'filter_value' => 'm', 'filter_oper' => '='),
            array('col_name' => 'b', 'filter_value' => 'n', 'filter_oper' => '='),
            array('col_name' => 'c', 'filter_value' => 'o', 'filter_oper' => '=')
        )
    ),
    array(
        'key' => 'OR',
        'data' => array(
            array('col_name' => 'd', 'filter_value' => 'p', 'filter_oper' => '='),
            array('col_name' => 'e', 'filter_value' => 'q', 'filter_oper' => '='),
            array('col_name' => 'f', 'filter_value' => 'm', 'filter_oper' => '=')
        )
    ),
    array(
        'key' => 'AND',
        'data' => array(
            array('col_name' => 'g', 'filter_value' => 'r', 'filter_oper' => '='),
            array('col_name' => 'h', 'filter_value' => 's', 'filter_oper' => '='),
            array('col_name' => 'i', 'filter_value' => 't', 'filter_oper' => '=')
        )
    ),
    array(
        'key' => 'OR',
        'data' => array(
            array('col_name' => 'j', 'filter_value' => 'u', 'filter_oper' => '='),
            array('col_name' => 'k', 'filter_value' => 'v', 'filter_oper' => '='),
            array('col_name' => 'l', 'filter_value' => 'w', 'filter_oper' => '=')
        )
    ),
);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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