Изменение значения внутри цикла 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);

Очистили его и сделали его работоспособным.

Ответ 1

В документе 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
?>

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

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

Ответ 2

Try

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

Ответ 3

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

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

Ответ 4

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

Try

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

Ответ 5

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

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

Ответ 6

Try

$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);

В зависимости от того, чего вы хотите достичь

Спасибо :)

Ответ 7

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

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

Ответ 8

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

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

unset($value);

print_r ($store);

Ответ 9

foreach(array_container as & array_value)

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