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.