2009-06-02 52 views
0

我有一個數組數組,每個數組都包含醫療設備掃描的詳細信息。我從夜間傾倒的文本日誌中獲取這些數據。它的格式是這樣的:array_filter過濾出整個數組

$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")); 

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; 

VS

$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 2009-06-02 18:15:50

1

就我所見,「==」與「=」的簡單情況。

$scan['reviewed'] = 1; 

那應該做的伎倆。有時最簡單的問題是最難發現的;-)