2009-06-02 2 views
0

私は配列の配列を持っています。各配列には、医療機器によるスキャンの詳細が含まれています。夜間にダンプされるテキストログからこのデータを取得しています。形式はこれです:array_filter array全体をフィルタリングする

$this->scans = array(
    array( 
    'patientid' => (int), 
    'patientname' => 'John Skeet', 
    'reviewed' => 0 or 1 
    //plus more irrelevant 
), 
    array(
    //same as above 
), //etc 
) 

それは十分に高い品質のものである場合には、各スキャンをレビューすることができるように重要な配列のキーは、ここで、reviewedです。ただし、テキストログは、取得されたすべてのスキャンをダンプしてから、戻ってきて、レビューされたものを再表示します。

重複を防ぐために、array_filterを使用して、取得してレビューしたスキャンを除外することができたと思いました。しかし、フィルタ関数は配列全体をフィルタリングしています(まれな場合を除いて)。誰かが見て、なぜ私は彼らがそれが起こっていると思う理由を知らせることができれば、それは非常に感謝されるだろう。

$this->scans = array_filter($this->scans, array($this, "scan_cleanup")); 

$scan['reviewed'] = 1; 

一つの対

private function scan_cleanup($scan) { 
     //only if the scan was not reviewed 
    if ($scan['reviewed'] == 0) { 
       //change reviewed status to see if there is a duplicate 
     $scan['reviewed'] == 1; 
       //return false to remove this copy (and keep reviewed) 
     if (in_array($scan, $this->scans)) { 
      return false; 
     } 
    } 
    return true; 

} 

答えて

2
$scan['reviewed'] == 1; 

他はありません、この文脈では何もしないという条件付きです。

あなたはまた、非常に頻繁にreturn falseを実行していません。私はロジックを少し変更して少し明確にし、リファクタリング(条件チェックを引き出す)によって簡単にしました。

if ($scan['reviewed'] and hasDupe($scan)) { 
    return false; // filter out 
} 
return true; // it is passed back, and is output 

hasDupe()は、重複したレコードについて知っている最良のチェックを行い、true/falseを返します。

+0

フィギュア、それはいつもとても簡単です。私はこれを永久にデバッグするのに過ごしました。ありがとう。 – tj111

+1

私が追加した更新は、読みやすさの面でも大いに役立ちます –

1

"=="対 "="のシンプルな例です。

$scan['reviewed'] = 1; 

これは間違いありません。場合によっては最も簡単な問題が最も見つけにくい場合があります;-)

関連する問題