繁体   English   中英

带有或语句的php多键值过滤器

[英]php Multiple Key Value Filter with an or statement

我一直在到处寻找这个,但我不确定是否可以做到这一点。 但我希望有人能指出正确的方向。

我从mysql获取多维数组。 我需要过滤此数组,所以我正在使用以下代码

$filter = new MultipleKeyValueFilter(array(
    'sex' => '1',
  'age' => '4'

));

print_r(array_filter($ads_array, array($filter, 'filter')));

如您所见,我已经设置了过滤器值,但是我需要这些值来做这样的事情

$filter = new MultipleKeyValueFilter(array(
    'sex' => '1' or '0',
  'age' => '4'

));

echo "Filtered by multiple fields\n";
print_r(array_filter($ads_array, array($filter, 'filter')));

如您在上面的代码中看到的,我想将它们都保留在数组中。 该字段可以为1或0,两者都很好。 但是当我尝试这个时,我什么也没得到。 因此,看来我不能使用or,也不能||。

我应该如何处理这个问题。 我怎样才能接受两个值作为一个好的结果?

我正在使用的其他代码是这些

class MultipleKeyValueFilter implements Filter {
    protected $kvPairs;

    public function __construct($kvPairs) {
        $this->kvPairs = $kvPairs;
    }

    public function filter($item) {
        $result = true;

        foreach ($this->kvPairs as $key => $value) {
            if ($item[$key] !== $value)
                $result &= false;
        }

        return $result;
    }
}


class MultipleKeyComparator implements Comparator {
    protected $keys;

    public function __construct($keys) {
        $this->keys = $keys;
    }

我希望我在这里有点道理。

它不起作用的原因是因为当您说:

 'sex' => '1' or '0', 

被解释为内联条件,然后结束

'sex' => true,

如果您希望MultipleKeyValueFilter做您想做的事情,那么您将必须同时更改条件数组和过滤器类。 您将要传递类似以下内容:

'sex' => ['1', '0'], //1 and 0 are acceptable values

并将您的比较器重写为:

public function filter($item) {
    foreach ($this->kvPairs as $key => $value) {
        if(is_array($value) {
            $match = false;

            foreach($value as $v) {
                $match = ($item[$key] === $v);
                if($match) {
                    break; //If we find one match in our array, we can stop looking
                }
            }

        } else {
            $match = ($item[$key] === $value);
        }

        if(!$match) {
            return false; //Any failure to match can stop immediately
        }
    }

    return true; //If we get here, then we didn't fail to match any criteria
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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