Изменение значения внутри цикла foreach не меняет значения в массиве, который повторяется - PullRequest
10 голосов
/ 29 марта 2012

Почему это приводит к этому:

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
)

Я пытаюсь получить 101Телефон - Каталог продукции TXT.txt.gz

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

РЕДАКТИРОВАТЬ: Хорошо, я нашел решение ... мои переменные в моем массиве имели значения, которые я не мог видеть ... делает

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

Почистил и заставил работать должным образом

Ответы [ 9 ]

38 голосов
/ 29 марта 2012

В документе 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
/** this won't work **/
foreach (array(1, 2, 3, 4) as &$value) {
    $value = $value * 2;
}
?>
6 голосов
/ 29 марта 2012

Попробуйте

foreach( $store as $key => $value){
    $store[$key] = $value.".txt.gz";
}
5 голосов
/ 29 марта 2012

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

foreach ($store as $key => &$value) {
                       //  ^ reference
    $value .= '.txt.gz';
}
3 голосов
/ 29 марта 2012

Попробуйте

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

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

Спасибо :)

3 голосов
/ 29 марта 2012

пропуск $value в качестве ссылки:

foreach( $store as $key => &$value){
   $value = $value.".txt.gz";
}
3 голосов
/ 29 марта 2012

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

Попробуйте

 $store[$key] = $value.".txt.gz";
2 голосов
/ 28 января 2014
foreach(array_container as & array_value)

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

2 голосов
/ 29 марта 2012

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

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

unset($value);

print_r ($store);
2 голосов
/ 29 марта 2012

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

$func = function($value) { return $value . ".txt.gz"; };
print_r(array_map($func, $store));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...