2012-07-26 115 views
0

我有一個工作腳本,但我確信我的數組管理方法可能會更好。我搜索了一個解決方案,但沒有找到解決方案,但我確信我應該使用關聯數組的功能來更高效地完成任務。PHP - 從多維數組中檢索值

我有兩個數組,一個來自CSV文件,另一個來自數據庫。我已經將CSV數組創建爲數字,將DB數組創建爲關聯(儘管我知道差異在PHP中是模糊的)。

我正試圖在DB數組中找到一個記錄,其中一個字段中的值與CSV數組中的值匹配。兩個陣列都是多維的。

在每個陣列的每個記錄中都有一個參考號。它在CSV數組中出現一次,並可能出現在DB數組中。如果有,我需要採取行動。

我目前這樣做(簡化):

$CSVarray: 
('reference01', 'blue', 'small'), 
('reference02', 'red', 'large'), 
('reference03', 'pink', 'medium') 

$Dbarray: 
(0 => array(ref=>'reference01',name=>"tom",type=>"mouse"), 
(1 => array(ref=>'reference02',name=>"jerry",type=>"cat"), 
(2 => array(ref=>'reference03',name=>"butch",type=>"dog"), 



foreach ($CSVarray as $CSVrecord) { 
    foreach ($Dbarray as $DBrecord) { 
     if ($CSVarray[$numerickey] == $DBrecord['key'] { 
      do something with the various values in the $DBrecord 
     } 
    } 
} 

這是可怕的,因爲陣列是每千行。

我不只是想知道匹配值是否存在,我想從匹配的記錄中檢索數據,所以像'array_search'這樣的函數不會做我想做的事情,array_walk似乎並不比我更好目前的做法。

我真正需要的是這樣的(廢話代碼):

foreach ($CSVarray as $CSVrecord) { 
    WHERE $Dbarray['key']['key'] == $CSVrecord[$numerickey] { 
     do something with the other values in $Dbarray['key'] 
    } 
} 

我正在尋找一種方式來匹配使用鍵(數字或聯想),而不是走在數組中的值。任何人都可以提供任何幫助嗎?

+0

你試過in_array()? – Matt 2012-07-26 15:31:48

+0

不in_array()只是搜索值嗎?當找到值時我需要採取行動,並且我沒有看到in_array()引用它找到的記錄的方法。我錯過了什麼嗎? – 2012-07-26 15:42:32

+0

嘗試array_walk_recursive函數。 – MilMike 2012-07-26 15:43:49

回答

0

您可以使用foreach循環這樣太:

foreach ($record as $key => $value) { 
    switch($key) 
    { 
    case 'asd': 
     // do something 
     break; 
    default: 
     // Default 
     break; 
    } 
} 

開關可能是你在找什麼也:)

+1

在foreach中是否仍然需要foreach?一旦找到所需的值,我就可以使用SWITCH來採取行動,但我不認爲這會減少數組遍歷的數量。 – 2012-07-26 15:45:17

+0

是的,它仍然需要一個foreach foreach,我只是展示如何使用它。除非你正在處理數百萬條記錄,否則遍歷兩個列表沒有問題...... – MasterGberry 2012-07-26 15:47:00

+0

謝謝,問題是每個數組包含數千條記錄,我實際上正在做數千萬次比較,而我的窮人筆記本電腦需要一段時間來咀嚼它:) – 2012-07-26 15:51:16

0

負載CSV到數據庫,並使用DB(不分貝陣列)如果可能的話檢索。索引referenceid字段。

+0

我沒有想到這種方法,謝謝。我將銘記未來的問題。 – 2012-07-26 15:53:05

+0

在處理不斷變化的大容量csvs時,我發現只需加載到db並讓db處理所有內容就容易多了。 – 2012-07-26 16:25:53

2

使用哈希映射 - 取一個數組並將其所屬記錄的每個鍵映射到該記錄。然後取第二個數組,並簡單地遍歷它,檢查每個記錄鍵,如果hashmap有任何設置。 關於你提到的例子:

foreach ($DBarray as $DBrecord){ 
    $Hash[$record[$key]] = $DBrecord; 
} 

foreach ($CSVarray as $record){ 
    if (isset($Hash[$record[$CSVkey]])){ 
     $DBrecord = $Hash[$record[$CSVkey]]; 
     //do stuff with $DBrecord and $CSVrecord 
    } 
} 

這個解決方案工作在O(n)的,而你在爲O(n^2)...

+0

謝謝。我已更新我的腳本以使用哈希映射。有問題的子程序從11-12秒跑到跑0.5-0.6秒。這顯然是一個巨大的進步。再次感謝。 – 2012-07-27 14:23:53

+0

我不知道你是否注意到了,但我寫的代碼更多的是簡化。在上面的代碼中,如果兩個或多個DBRecords具有相同的密鑰,則在稍後階段,您將只檢索最新的記錄。爲了克服這個問題,你可以設置hashmap [key]指向一組記錄。 – Anorflame 2012-07-28 05:05:59