2017-10-08 30 views
1

給定一個PHP對象,例如:對象是否選擇的特性PHP快速識別= TRUE

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

沒有人知道與開始的一個更好的,一個行的方式和數組的像這樣的過濾器:

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

並返回TRUE如果對象與兩個過濾器相比,而不是編寫一個函數,它會逐個遍歷每個過濾器並檢查對象是否匹配?

+0

如果你寫了一個合適的函數,它就會成爲一個班輪。 –

+0

已經寫了,只是好奇,如果有一個性感的PHP技巧,看起來更好,通過合併數組或其他東西 – NaturalBornCamper

回答

1

,我希望我沒有錯過什麼,這有助於:

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

嘿,謝謝你的朋友:)我沒有計劃在我的過濾器陣列上設置TRUE/FALSE值,但我想我可以讓它工作得更靈活一些,例如請求一個FALSE值! – NaturalBornCamper

+0

基本上,具有值的過濾器可以使array_diff_assoc首先檢查對象的鍵/值。是的,它還增加了檢查FALSE值的選項。 :) – demi

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

+0

array_reduce()行對我來說有點太長,但這仍然是一個好方法,謝謝! – NaturalBornCamper

相關問題