我有阵列过滤多维数组
$rows = [
['k'=>1, 'dop1'=>'take', 'dop2' => 'a', 'dat' => '25-11-2016'],
['k'=>2, 'dop1'=>'make', 'dop2' => 'b', 'dat' => '26-11-2016'],
['k'=>3, 'dop1'=>'sake', 'dop2' => 'c', 'dat' => '27-11-2016'],
['k'=>4, 'dop1'=>'bake', 'dop2' => 'd', 'dat' => '28-11-2016'],
['k'=>5, 'dop1'=>'dake', 'dop2' => 'e', 'dat' => '29-11-2016'],
['k'=>6, 'dop1'=>'jake', 'dop2' => 'f', 'dat' => '30-11-2016'],
['k'=>7, 'dop1'=>'ake', 'dop2' => 'g', 'dat' => '24-11-2016']
];
和另一个数组用于过滤
$filters = [
['dat', '=', '27-11-2016'],
['dop1', '=', "bake"],
['dop1', '=', "sake"],
['dop1', '=', "take"],
];
如果重复阵列滤光器的第一个元素,将它们之间OR
表达,否则将是AND
表达式。 所以这里的结果必须是['k'=>3, 'dop1'=>'sake', 'dop2' => 'c', 'dat' => '27-11-2016']
,因为'dat' => '27-11-2016'
存在于filters数组中,并且'dop1'=>'sake''dop1'=>'sake'
也存在。你能帮我吗?
UPDATE 这是我的代码示例,但在注释的位置存在问题。
$dop = ['dop1', 'dop2', 'dop3', 'dop4'];
$result = [];
foreach ($rows as $row) {
foreach ($filters as $filter) {
if(in_array($filter[0], $dop)){
$new_filter = [];
$f = explode("\n", $filter[2]);
foreach ($f as $item) {
array_push($new_filter, [$filter[0], $filter[1], $item]);
}
if(count($result) == 0){
foreach ($new_filter as $new) {
if($row[$new[0]] == $new[2]){
array_push($result, ['r' => $row, 'filter' => $new, 'validity' => 'valid']);
}
}
} else {
foreach ($new_filter as $new) {
for($i=0;$i<count($result);$i++){
if($result[$i]['filter'][0] == $new[0] && $result[$i]['filter'][1] == $new[1] && $result[$i]['filter'][2] != $new[2]){
//array_push($result, ['r' => $row, 'filter' => $new, 'validity' => 'valid']);
}
}
}
$invalid = 1;
$id = 0;
foreach ($new_filter as $new) {
for($i=0;$i<count($result);$i++){
if($result[$i]['r'][$new[0]] == $new[2]){
$invalid = 0;
$id = $i;
break 2;
}
}
}
if($invalid == 1){
$result[$id]['validity'] = 'invalid';
}
}
} elseif($filter[0] == 'dat') {
if(count($result) == 0){
if($row[$filter[0]] == $filter[2]){
array_push($result, ['r' => $row, 'filter' => $filter, 'validity' => 'valid']);
}
} else {
if($row[$filter[0]] == $filter[2]){
for($i=0;$i<count($result);$i++){
if($result[$i]['r'][$filter[0]] != $filter[2]){
$result[$i]['validity'] = 'invalid';
}
}
}
}
}
}
}
$c = 0;
foreach ($result as $r) {
if($r['validity'] == 'valid'){
$c++;
}
}
echo $c;
你可以再试一次来说明OR和AND部分......我不完全相信我明白了。你的例子预期的结果是好的......但请澄清当你是或当你是和。 – WEBjuju
我不能发现你自己的尝试,所以你自己的代码来实现这一点。你如何期待我们帮助?请注意,我们在这里帮助您编写代码,而不是为您编写代码。为此,请聘请付费程序员。 – arkascha
@arkascha抱歉,忘记了我自己的代码,我更新了问题,请帮助我。 –