2012-03-29 9 views
10

Dlaczego ten plon to:Zmiana wartości wewnątrz pętli foreach nie zmienia wartości w tablicy są potwierdzili ponad

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 
) 

Próbuję dostać 101Phones - Katalog wyrobów TXT.txt.gz

Myśli o tym, co się dzieje?

EDIT: Dobra znalazłem rozwiązanie ... moje zmienne w moim tablicy miał wartości nie widziałem ... robi

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

Oczyszczone go i sprawiły, że działa prawidłowo

Odpowiedz

3

Ty przepisuje wartość w pętli, a nie odwołanie do klucza w twojej tablicy.

Spróbuj

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

Spróbuj

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

$value zmiennej w tablicy jest tymczasowy, to nie odnosi się do wpisu w tablicy.
Jeśli chcesz zmienić oryginalny wpis tablicy, użyj odniesienie:

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

Kiedy robię to, że daje mi: Array ( .txt.gz => 101Phones - Katalog wyrobów TXT .txt.gz => 1-800-kwiatowy - Katalog wyrobów 1 ) – user1179295

+0

Należy na pewno nie że. Opublikuj pełny kod, który wygeneruje ten wynik. – deceze

+0

Po prostu zdałem sobie sprawę, że jest to coś dziwnego z moich zmiennych .... Stworzyłem tablicę $ stores = array ("tree", "boat"); i zadziałało ... jaki jest dobry sposób na usunięcie niewidocznych postaci? – user1179295

37

Doc http://php.net/manual/en/control-structures.foreach.php jasno stwierdza, dlaczego masz problem:

„aby móc bezpośrednio modyfikować elementów tablicy wewnątrz pętla poprzedza wartość $ z &. W takim przypadku wartość zostanie przypisana przez odniesienie. "

<?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 
?> 

Odwoływanie wartość $ jest możliwe tylko wtedy, gdy powtarzanych tablica może odwoływać się (to znaczy, jeśli jest zmienna). Poniższy kod nie zadziała:

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

Ciągle otrzymuję to, gdy podążam za pierwszym przykładem: Array ( .txt.gz => 101Phones - Katalog produktów TXT .txt.gz => 1-800-FLORALS - Katalog produktów 1 ) dlaczego to przypisywanie mój klucz jako tekst dodawany do zmiennej? – user1179295

+2

Jeśli ktokolwiek zdarzy się wpaść w to tak, jak zrobiłem to po mnie, to jest rozwiązanie tego pytania przez większość czasu. OP, rozważ oznaczenie tej opcji jako właściwej odpowiedzi, jeśli kiedykolwiek ponownie się zalogujesz ... – RaKXeR

3

przepustkę $value jako odniesienie:

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

jak o tablicy mapy:

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

to daje błąd analizy – user1179295

+0

";" brakowało, poprawiłem to. –

3

Spróbuj

$catalog = array(); 

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


print_r ($catalog); 

LUB

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


print_r ($store); 

Zależy co chcesz osiągnąć

Dzięki :)

+0

Jego pominięcie .txt.gz Array ( [1] => 101Phones - Katalog produktów TXT [2] => 1-800-kwiatowy - Katalog wyrobów 1 ) – user1179295

+0

to nieprawda .. patrz http://codepad.org/dpHjXtzz – Baba

2

Wierzę, że to, co chcesz zrobić:

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

unset($value); 

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

jest sposób zmodyfikować wartość elementu tablicy wewnątrz pętli foreach.

Powiązane problemy