2013-01-24 58 views
2

我有點卡住,不知道從哪裏開始解決這個問題。我有一個MySQL查詢時寫出記錄爲一個字符串像這樣:MySQL查詢PHP字符串停止寫在最後一列的分隔符

$values = mysql_query("SELECT Pointer AS Pointer, VNum AS Vnum FROM ".$table.""); 
$row = 0; 
while ($rowr = mysql_fetch_assoc($values)) 
{ 
    foreach($rowr as $name => $value) 
    { 
     $csv_output .= $value."|"; 
    } 
     $csv_output .= "\n"; 
} 

除了Vnum值結束了這個偉大的工程與附加給它這樣的|

10467 | 66 |

我需要寫出來像10467|66值沒有Vnum值後|分隔符。我該如何處理?

回答

1

其實,如果你正在使用foreach,循環將繼續,直到達到最後還是NULL值,因此處理的最後一個字符或|,你必須添加代碼,以消除最後一個字符。 我修改您的代碼現在試試這個:

$values = mysql_query("SELECT Pointer AS Pointer, VNum AS Vnum FROM ".$table.""); 
$row = 0; 
while ($rowr = mysql_fetch_assoc($values)) 
{ 
    foreach($rowr as $name => $value) 
    { 
     $csv_output .= $value."|"; 
    } 
     $csv_output = substr_replace($csv_output ,"",-1); //these will remove the excess char 

     $csv_output .= "\n"; 
} 
+1

完美,非常感謝! –

+0

而_this_答案是接受的答案?! omg:連接,只能在事後刪除它?你可以用一行代碼得到相同的結果! –

1

在這裏你去:

$csvArray = array(); 
foreach ($rowr as $name => $value) { 
    $csvArray[] = $value; 
} 
$csv_output = implode('|', $csvArray); 
+0

這將*仍然*留下一個尾隨管道和雙管道的行加入。 – Sammitch

+0

@Sammitch我的壞,現在修復。 –

2

當我做類似的東西,我做一個數組,然後做一個連接 - 它把分隔符只有在兩者之間,沒有終點。

$arr = array(); 
foreach($rowr as $name => $value) 
{ 
     $arr[] = $value; 
} 
$csv_output = join('|',$arr); 
+1

請注意,'join'可能很快就會被棄用。這是'implode'的別名,就像'split'是'爆炸'一樣。後者已被正式棄用,如果「加入」跟隨套件,我不會感到驚訝。 –

+0

在文檔中沒有任何跡象表明,所以誰知道。 – dgig

+0

只需花一些時間瀏覽開發人員的郵件列表:他們談論PHP6中的'mysql_ *'擴展_removing_,它可以成爲5.5之後的下一個版本。另外:PHP對其龐大的全局命名空間有很大的懈怠。 IMO的第一個功能就是那些不經常使用的功能......(比如'join',恐怕)。我沒有投下你的答案,因爲這是一個有效的答案。我只是覺得這是你可能想要考慮的事情。 –

2

你爲什麼不只是破滅數組:

$csv_output .= implode('|', $rowr)."\n"; 

這應該給你想要的結果。

請注意,mysql_*擴展名已被棄用,不應用於編寫新代碼。看看PDO和/或mysqli_*i代表改進

「滿」 while循環最終看起來像這樣:

while ($rowr = mysql_fetch_assoc($values)) 
{ 
    $csv_output .= implode('|', $rowr)."\n"; 
} 

或者,你可以直接將數據傳送到CSV寫(自定義分隔符):

$handle = fopen('mycsv.csv','w+'); 
while ($rowr = mysql_fetch_assoc($values)) 
{ 
    fputcsv($handle, $rowr, '|'); 
} 
fclose($handle); 

而且就是這樣:你的文件被創建,幷包含所有的數據。查看文檔以獲取更多關於fputcsv function的信息。

1

另一種方法:

$values = mysql_query("SELECT Pointer AS Pointer, VNum AS Vnum FROM ".$table.""); 
$row = 0; 
$csv_output = ''; 
while ($rowr = mysql_fetch_assoc($values)) 
{ 
    foreach($rowr as $name => $value) 
    { 
     $csv_output .= $value."|"; 
    } 
    $csv_output .= substr($csv_output, 0, -1) . "\n"; 
    // we subtract one char at the end 
} 
2

使用implode()

$values = mysql_query("SELECT Pointer AS Pointer, VNum AS Vnum FROM ".$table.""); 
$row = 0; 
while ($rowr = mysql_fetch_assoc($values)) { 
    $csv_output .= implode('|', $rowr) . "\n"; 
} 

此外,停止使用mysql_ *功能,等等等等等等PDO庫MySQLi。

1

你只需要看看你要打印的$值是否是最後一個,並且只在不是最後一個時才添加字符。

while ($rowr = mysql_fetch_assoc($values)) 
{ 
    $last = rowr[count($rowr)-1]; 
    foreach($rowr as $name => $value) 
    { 
     $csv_output .= $value; 
     if($last != $value){ 
      echo "|"; 
     } 
    } 
     $csv_output .= "\n"; 
} 
0

$ csv_output = RTRIM($ csv_output, '|');

1

爲什麼不直接在MySQL上這樣做,所以你不會在你的PHP代碼上有任何級聯?
MySQL使用內置的功能GROUP_CONCAT

例如記錄,

columnName 
=========== 
1 
2 
3 
4 
5 

查詢,

SELECT GROUP_CONCAT(columnName SEPARATOR '|') lists 
FROM TableName 

結果,

Lists 
========= 
1|2|3|4|5 
+0

我從來沒有嘗試過這個,也要嘗試一下......謝謝! –

相關問題