PHP快速识别对象是否已选择properties = TRUE

时间:2017-10-08 20:48:39

标签: php

给定一个PHP对象,例如:

[
    isAnimal->TRUE|FALSE,
    isMammal->TRUE|FALSE,
    hasFur->TRUE|FALSE,
    ...
]

有没有人知道一个更好的,一行的开头方式和过滤器数组如下:

$filters = array('isAnimal, hasFur');

并返回 TRUE 如果对象匹配两个过滤器而不是编写一个单独循环遍历每个过滤器的函数并检查对象是否匹配?

2 个答案:

答案 0 :(得分:1)

您可以在过滤器数组上使用array_reduce()来测试对象的各个属性,将它们减少为单个布尔值。像

这样的东西
class myObject {
    public $name;
    public $isAnimal;
    public $isMammal;
    public $hasFur;

    public function __construct($name, $isAnimal = false, $isMammal = false, $hasFur = false) {
        $this->name = $name;
        $this->isAnimal = $isAnimal;
        $this->isMammal = $isMammal;
        $this->hasFur = $hasFur;
    }
}

$table = new myObject('Table');
$dolphin = new myObject('Dolphin', true, true);
$dog = new myObject('Dog', true, true, true);

$objectSet = [
    $table,
    $dolphin,
    $dog,
];

$filters = array('isAnimal', 'hasFur');

foreach($objectSet as $objectValue) {
    var_dump(
        $objectValue->name,
        array_reduce(
            $filters, 
            function($returnValue, $filter) use ($objectValue) {
                $returnValue &= $objectValue->{$filter};
                return (bool) $returnValue;
            },
            true
        )
    );
}

Demo

答案 1 :(得分:1)

我希望我没有错过任何东西,这有帮助:

$filter = array('hasEyes'=>true,'hasHead'=>true);
if (!array_diff_assoc($filter,(array)$obj))
{
    return true;
}