2013-01-31 36 views
1

我從數據庫中提取一些數據(與我所說的查詢功能)傳球,我想另一個鍵/值對添加到每個結果,即:經與PHP的foreach困難和參考

$items = query("SELECT * FROM items"); 

foreach($items as &$item) { 
    $item['fixedname'] = str_replace(' ','_',$item['name']); 
} 

現在我希望把這些在HTML視圖,即:

<?php foreach($items as $item): ?> 
<div id="<?= $item['fixedname'] ?>" ><?= $item['name'] ?></div> 
<?php endforeach; ?> 

然而,這正常不輸出。例如,當查詢返回兩個項目時,php中的循環輸出兩次相同的東西。如果有三個:輸出第一個,然後輸出第二個。這裏有什麼問題?

+2

什麼是這裏使用參考的原因嗎? – 2013-01-31 19:54:45

+0

@Akam說了些什麼。除非你完全確定你在做什麼,否則不要使用PHP的參考。改爲使用副本。 – Amelia

+0

我需要在它之前的數組中添加一個新的密鑰(固定名稱)。沒有通過參考,它沒有被添加到循環之外。 – Danthier

回答

0

在foreach右側返回的數據是數據的副本,不能直接修改。相反,您需要獲取$ key(數組中項目的ID)和$ item。通過讓PHP告訴你$ key,你不必擔心數組是否正常(例如索引爲0,1,2,...)和關聯。

This example would walk the $items array and add 'fixedname' into it. 

foreach($items as $key => $item) { 
    $items[$key]['fixedname'] = str_replace(' ','_',$item['name']); 
} 
+0

這工作完美,謝謝! – Danthier

4

當使用foreach()修改時,我偶爾有奇怪的結果。我用

foreach ($items as $key=>$value) { 
    $items[$key] = modified($value); 
} 

或者說,爲什麼不這樣做在SQL SELECT your, fields, here, REPLACE(name, ' ', '-') AS fixedname

+0

如果我需要直接添加另一個鍵/值對,那麼以後會通過php給出另一個值?有沒有辦法做到這一點,或者如果沒有,用SQL語句創建一個空的返回值? – Danthier

+0

你可以在你的SQL中創建「dummy」字段 - 例如SELECT field1,field2,TRIM('')AS field3' - 但我不會推薦它。如果你繼續沿着添加更多和更多的假人的路線,那麼我建議重新考慮你的數據庫模式。 –

0

您可以爲循環

<?php 
    for($i=0; $i < count($items); $i++){ 
     $items[$i]['fixedname'] = str_replace(' ','_',$items[$i]['name']); 
    } 
?> 

做一個正常的那麼一切都將準備好當你去你的下一個的foreach。

+1

這有效。儘管如此,我仍然不知道第一起案件發生了什麼。 – Danthier

0

u有一大堆錯事

- 不要用mysql,使用PDOmysqli代替

- $items = query("SELECT * .... --->調用未定義功能查詢()

更改爲

$items = mysql_query("SELECT * .... 

- Invalid argument supplied for foreach()

你錯過了獲取查詢

嘗試這整個代碼

$items = mysql_query("SELECT * FROM items"); 

?> 
<?php while ($row = mysql_fetch_array($items)) {?> 
<div id="<?php echo $row['fixedname'] ;?>" ><?php echo $row['name']; ?></div> 
<?php } ?> 
+1

Danthier說他有一個叫做'query'的方法,它可能會返回一個項目列表。 – Jim