2013-01-06 141 views
1

在這裏坐了幾個小時,但我看不出什麼問題。PHP陣列搜索和fgetcsv

我有1個文件: Gross_matching.csv:

Actionspiele,77 
Strategiespiele,112 

而且關鍵字 「Actionspiele,Strategiespiele」。

想要得到這個文件,然後在「Actionspiele」之後搜索並且想要得到「77 | 112」。但我得到「77 | 77」。有人知道爲什麼嗎?

<?php 
if (!empty($articleData['keywords'])) { 
    $temp_dir = "..."; 
    if (file_exists($temp_dir."gross_matching.csv")) { 
     $csv = array(); 
     $file_gross = fopen($temp_dir."gross_matching.csv", 'r'); 
     while (($result = fgetcsv($file_gross, ",")) !== false) { 
      $csv[] = $result; 
     } 
     fclose($file); 
    } else { 
     $articleData['attr_attr18'] .= " | File not found"; 
    } 
    if (!empty($csv)) { 
     $string = ''; 
     $keywords = explode(",", $articleData['keywords']); 
     if(is_array($keywords)) { 
      foreach($keywords as $key => $value) { 
       $pos = array_search($value, $csv); 
       $string .= $csv[$pos][1]."|"; 
      } 
      if (!empty($string)) { 
       $articleData['attr_attr18'] = $string; 
      } else { 
       $articleData['attr_attr18'] .= " - String empty"; 
      } 
     } 
    } else { 
     $articleData['attr_attr18'] .= " - csv empty"; 
    } 
} else { 
    $articleData['attr_attr18'] .= " - not Gross"; 
} 
?> 
+0

也將搜索放入它自己的函數中。所有這些if和else的樹以及什麼都不是和temp在這裏,關鍵詞那裏只有阻礙。 – hakre

+0

如果您添加更多的CSV數據,而不僅僅是兩個搜索信息,那將會很不錯,因爲還有很多事情仍然需要考慮,如重複的關鍵字等,您還應該爲您的數據添加預期輸出 – Baba

回答

4

您嘗試使用array_search()尋找數組$csv在字符串"Actionspiele",但該數組中所有的值本身是數組,而不是字符串,所以搜索失敗並返回false。當你使用false作爲數組索引時,它被轉換爲0,所以它總是給你數組的第一行。

我會重寫你的陣列的建築規範過於看起來像這樣:

$csv = array(); 
while ($result = fgetcsv($file_gross, ",")) { 
    $csv[ $result[0] ] = $result[1]; 
} 

這將使用CSV文件作爲鍵和第二列作爲$csv數組的值的第一列,所以它會是這樣的:

$csv = array(
    'Actionspiele' => 77, 
    'Strategiespiele' => 112, 
); 

然後,你可以簡單地查找關鍵字數組中的直接,就像這樣:

$ids = array(); 
foreach ($keywords as $keyword) { 
    $ids[] = $csv[ $keyword ]; 
} 
$string = implode('|', $ids); 
+0

Ps。我期待有一個內置的數組函數可以替代上一個示例中的foreach循環,但是我查找並找不到一個,這讓我感到驚訝。例如,在Perl中,可以使用數組(well,hash)slice輕鬆完成這項工作,但PHP的'array_slice()'看起來並不多。我想'$ ids = array_intersect_key($ csv,array_flip($ keywords));'會做到這一點,但它似乎有點尷尬。 –

+0

你爲什麼說它的尷尬? – Baba

+0

@Baba:嗯,它使用了兩個相對比較模糊的函數(三個如果你堅持結果中的數字鍵),應該是一個簡單而常見的操作。即使那樣,它也不會尊重關鍵字的順序,也不會允許關鍵字被複制。 (當然,在這個特殊情況下,這些都不一定是問題。)在我看來,應該有更好的方法。 –