Изменение значения внутри цикла foreach не изменяет значение в массиве, который повторяется

Почему это дает следующее:

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 ) 

Я пытаюсь получить 101Phones – Каталог продукции TXT.txt.gz

Мысли о том, что происходит?

EDIT: Хорошо, я нашел решение … мои переменные в моем массиве имели значения, которые я не мог видеть …

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

Убрал его и заработал правильно

В документе http://php.net/manual/en/control-structures.foreach.php четко указано, почему у вас есть проблема:

«Чтобы иметь возможность напрямую изменять элементы массива в цикле, перед значением $ value нужно указать &. В этом случае значение будет присвоено ссылкой».

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

Ссылка на значение $ возможна только в том случае, если можно использовать итерированный массив (т.е. если это переменная). Следующий код не будет работать:

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

Пытаться

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

Переменная $value в массиве является временной, она не относится к записи в массиве.
Если вы хотите изменить исходную запись массива, используйте ссылку:

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

Вы переписываете значение в цикле, а не ключевую ссылку в вашем массиве.

Пытаться

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

передать $value в качестве ссылки:

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

Пытаться

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

ИЛИ

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

Зависит от того, чего вы хотите достичь

Благодаря 🙂

Я считаю, что это то, что вы хотите сделать:

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

Как насчет карты массива:

 $func = function($value) { return $value . ".txt.gz"; }; print_r(array_map($func, $store)); 
 foreach(array_container as & array_value) 

Способ изменения значения элемента массива внутри цикла foreach.