2011-02-15 252 views
0

我有一個數組如下Foreach循環問題

$posts = array(
    0 => array('user' => 'Charlie', 'message' => 'First message'), 
    1 => array('user' => 'Charlie', 'message' => 'Second message'), 
    2 => array('user' => 'Charlie', 'message' => 'Third message TEXT!'), 
    3 => array('user' => 'Charlie', 'message' => 'Fourth message') 
); 

,我想,以取代「TEXT」和「NEXT」,如果它是在郵件內。 我怎麼能這樣做?

我試着用

foreach ($posts as $r) 
{ 
    $r['message'] = str_replace('TEXT', 'NEXT', $r['message']); 
} 

,但似乎並不奏效。

+1

正如許多人所說,使用'&'。不要忘記在循環之後立即「取消設置($ r)」,否則您可能會意外地更改數組上次訪問的元素的值。 – binaryLV 2011-02-15 13:58:45

+2

我都是用粗言穢語來生產代碼,實際上我認爲它是開發過程中不可或缺的一部分 - 然而,我認爲SO應該保持清潔(我開始在6編程時搞亂了),所以我標記了你的文章。抱歉!! :) – 2011-02-15 13:59:47

+0

你已經改變了這個問題,所以一半的答案沒有意義了。 – 2011-02-15 14:16:42

回答

3
foreach ($posts as &$r) 
{ 
    $r['message'] = str_replace('TEXT', 'NEXT', $r['message']); 
} 
5

這是因爲foreach默認使用數組元素的副本,而不是元素本身。您可以使用&這個變化量與參考:

foreach ($posts as &$r) { 
2
foreach ($posts as &$r) 
{ 
    $r['message'] = str_replace('TEXT', 'NEXT', $r['message']); 
} 

的&將導致$ R是一個reference to它允許你去改變它原來的數組中的值。在你的代碼中,你正在修改一個副本。

1

@Charlie Pigarelli:嘗試 -

for ($i = 0; $i < count($posts); $i++) 
{ 
    $posts[$i]['message'] = str_replace('TEXT', 'NEXT', $posts[$i]['message']); 
} 
2
foreach ($posts as $key => $r) 
{ 
    $posts[$key]['message'] = str_replace('TEXT', 'NEXT', $r['message']); 
}