2012-05-05 80 views
0

我是一個新手到PHP,並一直在尋找解決這個問題不知疲倦(我敢打賭它的一個超級簡單的解決方案太嘆息了)。php:使用谷歌CSV,刪除重複的值填充列

我從谷歌文檔導入.csv飼料。它拉動2欄,一欄是「名字」,另一欄是「地點」。我想刪除重複的「地點」。因爲我使用fgetcsv,我的理解是它已經將數據排序到數組中。理想情況下,它將省略「位置」重複項,以便「名稱」看起來好像列在它們對應的「位置」下。

這裏是我有:

$url = "https://docs.google.com/spreadsheet/pub?key=0AsMT_AMlRR9TdE44QmlGd1FwTmhRRkFHMzFTeTZhS3c&output=csv"; 
    $handle = fopen($url, "r"); 
    while (($data = fgetcsv($handle, 5000, ",")) !== FALSE) { 
    echo "<li>\n"; 
    echo $data[1]; 
    echo "<br/>\n"; 
    echo $data[2]; 
    echo "</li>\n"; 
    } 
    fclose($handle); 

理想我想能夠使用像這樣:

$url = "https://docs.google.com/spreadsheet/pub?key=0AsMT_AMlRR9TdE44QmlGd1FwTmhRRkFHMzFTeTZhS3c&output=csv"; 
    $handle = fopen($url, "r"); 
    while (($data = fgetcsv($handle, 5000, ",")) !== FALSE) { 
    echo "<li>\n"; 
    echo array_unique($data[1]); 
    echo "<br/>\n"; 
    echo $data[2]; 
    echo "</li>\n"; 
    } 
    fclose($handle); 

提前任何幫助非常感謝! :o)

+0

你可以給一個樣本你的CSV看起來像什麼? – Baba

+0

Array([0] => timestamp [1] => location [2] => info) 這就是您要找的內容嗎?謝謝你迴應巴巴。 :O) – christa

+0

生'CSV' ....你可以把它放在引擎收錄 – Baba

回答

0

這可能工作,假設數組中的項目按位置分組。它存儲最後的數據項(位置)並比較每個項目是否具有該位置。如果是這樣,它打印它,否則它會創建帶有新位置的新列表項,然後下方打印的名字(我沒有測試它雖然):

$url = "the-url-to-my-csv-feed"; 
$handle = fopen($url, "r"); 
$lastdata = ''; 
while (($data = fgetcsv($handle, 5000, ",")) !== FALSE) { 
    if ($lastdata == '') { 
     echo "<li><strong>" . $data[1] . "</strong>\n"; 
     echo "<br/>\n"; 
     $lastdata = $data[1]; 
    } 

    if ($lastdata != $data[1]) { 
     echo "</li>\n"; 
     echo "<li><strong>" . $data[1] . "</strong>\n"; 
     echo "<br/>\n"; 
     $lastdata == $data[1]; 
    } 
    echo $data[2] . "<br/>\n"; 
} 
fclose($handle); 
+0

嗨安東尼,這仍然是重複的位置名稱 – christa

+0

我已經使用此代碼在鍵盤上創建了類似的東西:http://codepad.viper-7.com/y95E9J它似乎在那裏工作,我不知道問題可能是什麼。你能否檢查你的數組格式($ data)是否正確(如$ data [1]實際上是指位置而不是名稱)。另外,它不應該是基於零? ($ data [0]) – Anthony

0
<? //PHP 5.4+ 
$url = 'url to your csv feed'; 

//Group people by same location first, 
//not assuming csv is already sorted. 
$namesByLocations = []; 
//Because we're using \SplFileObject, when the reference goes out 
//of scope at the end of the loop, the file pointer is never 
//left open. This is true even if an exception is thrown 
//in the middle of looping. 
foreach(
    \call_user_function(static function() use ($url){ 
     $file = new \SplFileObject($url); 
     $file->setFlags(\SplFileObject::READ_CSV); 
     return $file; 
    }) 
    as $array 
){ 
    //$array[1] is assumed to be location string 
    //$array[2] is assumed to be a name that is there. 
    $namesByLocations[$array[1]][] = $array[2]; 
} 


foreach($namesByLocations as $location => $names){ 
    //Protect against injection flaws, 
    //escape to destination's context. (html this time) 
    echo '<strong>' . \htmlspecialchars($location) . '</strong>'; 
    echo '<ul>'; 
    foreach($names as $name){ 
     echo '<li>' . \htmlspecialchars($name) . '</li>'; 
    } 
    echo '</ul>'; 
} 
?> 
+0

您好科裏,即時獲取服務器錯誤... – christa

+0

您可能會遇到谷歌服務器設置,因爲其他評論者提到的原始問題。在此期間進行測試時,請嘗試使用磁盤上某處的csv副本。 –