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