2016-09-23 41 views
0

因此,這裏是我的代碼:PHP:如何從數組中只打印一次每個項目的值?

foreach ($result->devices as $device) { 
    $flag = false; 
    foreach ($device as $key => $value) { 
     if(!$flag){ 
      var_dump($key); 
      $flag = true; 
     } 
     var_dump($value); 
    } 
} 

我試圖實現的是僅打印鍵(描述,品牌等)只有一次,但打印所有這些密鑰的價值發現每個設備。這是爲了使它最終保存爲.csv

注意:$ result =一個多維數組,其中我只對它的設備部分感興趣,因此是$result->devices。 這個工程現在只打印了發現每個設備的第一個鍵的方式,我現在得到看起來類似:

string 'deviceId' (length=8) // keeps getting repeated 
int 4268 
string 'beschrijving nr 53' (length=18) 
... 
string 'deviceId' (length=8) // keeps getting repeated 
int 4267 
string 'Weer een tooltje' (length=16) 

我試圖得到的是類似的東西:

string 'deviceId' (length=8) 
string 'description' (length=??) 
string 'status' (length=??) 
... // rest of keys, followed by devices 
int 4268 
string 'beschrijving nr 53' (length=18) 
... // rest of values, followed by other devices 
int 4267 
string 'Weer een tooltje' (length=16) 

我確定這是簡單的,就像操作順序錯誤,或者將某些東西移入/移出某個循環,但在嘗試過各種變化之後,我並不聰明。

那麼誰能解開這個謎,我非常感謝你。

+1

add this'var_dump($ value);'in else – devpro

+0

這並不完全清楚你想要達到什麼,以及你自己做了什麼。你能否給我們展示一些代碼,以及一個帶有示例輸出csv的正確示例輸入數組。然後,我們可能能夠正確地提供幫助 –

+0

我會簡化它並分開編寫標題和數據行。在循環輸出第一個數組元素的鍵之前。然後遍歷所有元素並輸出值。 – Kwebble

回答

1

所以,我想,你的數據看起來有點像這樣?

$result = (object)[]; 

$result->devices = [ 
    ['deviceId' => 1, 'description' => 'desc1', 'status' => 'status14'], 
    ['deviceId' => 2, 'description' => 'desc2', 'status' => 'status15'], 
    ['deviceId' => 3, 'description' => 'desc3', 'status' => 'status16'], 
    ['deviceId' => 4, 'description' => 'desc2', 'status' => 'status17'], 
]; 

然後從中創建一個CSV文件我想是這樣的:

$fp = fopen('csv.csv', 'w+'); 

foreach($result->devices as $i => $device) 
{ 
    // First row? Write headers (keys) first! 
    if($i == 0) fputcsv($fp, array_keys($device)); 

    // Write data rows 
    fputcsv($fp, array_values($device)); 
} 
fclose($fp); 

這樣一來,你會得到這樣的:

deviceID,description,status 
1,desc1,status14 
2,desc2,status15 
3,desc3,status16 
4,desc4,status17 

這是你需要什麼?

+0

有趣的是使用普通數組作爲鍵=>值對。 – Kwebble

+0

@Oleg Dubas 我以前試過,但問題是,我的對象如下所示: $ result-> devices = [[= object(stdClass)) 'deviceId'=> 1 , 'description'=>'desc1', ... ], 1 => [ 'deviceId'=> 2, ... ] ] –

0

感謝Oleg Dubas,我發現了這個問題。看起來我過於複雜(正如我傾向於做的那樣),結合嘗試打印對象的某些部分,而不是將對象強制轉換爲數組。這就是爲什麼當我嘗試類似這樣的方法之前,它不起作用。這是新的和工作代碼:

foreach ($result->devices as $key => $device) { 
    if ($key == 0) { 
     fputcsv($out, array_keys((array)$device), "\t"); 
    } 
    fputcsv($out, array_values((array)$device), "\t"); 
} 

正如你可以看到它幾乎是相同的奧列格的代碼,但我不得不對象轉換爲關聯數組。

再次感謝Oleg的幫助。非常感謝。