2012-03-29 82 views
10

Tại sao năng suất này này:Thay đổi giá trị bên trong vòng lặp foreach không thay đổi giá trị trong mảng được lặp qua

foreach($store as $key => $value){ 
$value = $value.".txt.gz"; 
} 

unset($value); 

print_r ($store); 

Array 
(
[1] => 101Phones - Product Catalog TXT 
[2] => 1-800-FLORALS - Product Catalog 1 
) 

tôi đang cố gắng để có được 101Phones - Catalogue sản phẩm TXT.txt.gz

Suy nghĩ về những gì đang xảy ra?

EDIT: Được rồi tôi tìm thấy giải pháp ... biến của tôi trong mảng của tôi đã giá trị tôi không thể nhìn thấy ... làm

$output = preg_replace('/[^(\x20-\x7F)]*/','', $output); 
echo($output); 

sạch nó lên và làm cho nó hoạt động đúng

Trả lời

3

Bạn đang viết lại giá trị trong vòng lặp và không phải là tham chiếu chính trong mảng của bạn.

Hãy thử

$store[$key] = $value.".txt.gz"; 
6

Hãy thử

foreach($store as $key => $value){ 
    $store[$key] = $value.".txt.gz"; 
} 
5

Các $value biến trong mảng là tạm thời, nó không đề cập đến các mục trong mảng.
Nếu bạn muốn thay đổi các mục nhập mảng ban đầu, sử dụng một tài liệu tham khảo:

foreach ($store as $key => &$value) { 
         //^reference 
    $value .= '.txt.gz'; 
} 
+0

Khi tôi làm điều đó nó mang lại cho tôi: Array ( .txt.gz => 101Phones - Sản phẩm Catalogue TXT .txt.gz => 1-800-florals - Sản phẩm Catalogue 1 ) – user1179295

+0

Nó nên chắc chắn không làm cái đó. Đăng mã đầy đủ để tạo ra kết quả đó. – deceze

+0

Tôi chỉ nhận ra nó là một cái gì đó kỳ lạ từ các biến của tôi .... Tôi tạo ra một mảng $ cửa hàng = mảng ("cây", "thuyền"); và nó hoạt động ... whats một cách tốt để loại bỏ các nhân vật vô hình? – user1179295

37

Các doc http://php.net/manual/en/control-structures.foreach.php nêu rõ lý do tại sao bạn có một vấn đề:

"Để có thể trực tiếp chỉnh sửa các phần tử mảng trong vòng vòng lặp đứng trước giá trị $ với &. Trong trường hợp đó, giá trị sẽ được gán theo tham chiếu. "

<?php 
$arr = array(1, 2, 3, 4); 
foreach ($arr as &$value) { 
    $value = $value * 2; 
} 
// $arr is now array(2, 4, 6, 8) 
unset($value); // break the reference with the last element 
?> 

Tham chiếu $ value chỉ có thể được tham chiếu nếu mảng lặp có thể được tham chiếu (ví dụ: nếu đó là biến). Đoạn mã dưới đây sẽ không làm việc:

<?php 
/** this won't work **/ 
foreach (array(1, 2, 3, 4) as &$value) { 
    $value = $value * 2; 
} 
?> 
+0

Tôi vẫn nhận được điều này khi tôi làm theo ví dụ đầu tiên của bạn: Mảng ( .txt.gz => 101Phones - Danh mục sản phẩm TXT .txt.gz => 1-800-FLORALS - Danh mục sản phẩm 1 ) tại sao lại gán khóa của tôi là văn bản tôi thêm vào biến? – user1179295

+2

nếu có ai đó tình cờ gặp phải điều này như tôi đã làm sau tôi, đây là giải pháp cho câu hỏi này hầu hết thời gian. OP, xem xét việc đánh dấu đây là câu trả lời đúng, nếu bạn đăng nhập lại ... – RaKXeR

3

qua $value như một tài liệu tham khảo:

foreach($store as $key => &$value){ 
    $value = $value.".txt.gz"; 
} 
2

Làm thế nào về mảng đồ:

$func = function($value) { return $value . ".txt.gz"; }; 
print_r(array_map($func, $store)); 
+0

thats cho tôi một lỗi phân tích cú pháp – user1179295

+0

";" đã mất tích, tôi đã sửa lại điều đó. –

3

Hãy thử

$catalog = array(); 

foreach($store as $key => $value){ 
    $catalog[] = $value.".txt.gz"; 
} 


print_r ($catalog); 

HOẶC

foreach($store as $key => $value){ 
    $store[$key] = $value.".txt.gz"; 
} 


print_r ($store); 

Phụ thuộc vào những gì bạn muốn đạt được

Cảm ơn :)

+0

Bỏ qua .txt.gz Mảng ( [1] => 101Phones - Danh mục sản phẩm TXT [2] => 1-800-FLORALS - Danh mục sản phẩm 1 ) – user1179295

+0

Điều đó không đúng .. xem http://codepad.org/dpHjXtzz – Baba

2

Tôi tin rằng đây là những gì bạn muốn làm:

foreach($store as $key => $value){ 
$store[$key] = $value.".txt.gz"; 
} 

unset($value); 

print_r ($store); 
2
foreach(array_container as & array_value) 

có phải là cách để thay đổi giá trị phần tử mảng bên trong vòng lặp foreach.

Các vấn đề liên quan