2012-03-29 13 views
10

¿Por qué este rendimiento siguiente:Cambio de valor dentro de bucle foreach no cambia el valor de la matriz que se repiten a lo largo

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 
) 

que estoy tratando de conseguir 101Phones - Catálogo de Productos TXT.txt.gz

¿Pensamientos sobre qué está pasando?

EDIT: Bien he encontrado la solución ... mis variables en mi arsenal habían valores que no podía ver ... haciendo

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

lo limpió y lo hizo funcionar correctamente

Respuesta

3

Usted están reescribiendo el valor dentro del bucle, y no la referencia clave en su matriz.

Trate

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

Trate

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

La variable $value de la matriz es temporal, no se refiere a la entrada en la matriz.
Si desea cambiar la entrada de la matriz original, utilice una referencia:

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

Cuando hago que me da: Array ( .txt.gz => 101Phones - Catálogo de Productos TXT .txt.gz => 1-800-Floral - Catálogo de Productos 1 ) – user1179295

+0

Es ciertamente no debería hacer ese. Publique el código completo que produce ese resultado. – deceze

+0

Me acabo de dar cuenta de que es algo raro de mis variables .... Creé una matriz $ stores = array ("árbol", "bote"); y funcionó ... ¿cuál es una buena manera de eliminar personajes invisibles? – user1179295

37

El doc http://php.net/manual/en/control-structures.foreach.php dice claramente por qué usted tiene un problema:

"Con el fin de ser capaz de modificar directamente elementos de la matriz dentro de el ciclo precede al valor $ con &. En ese caso, el valor se asignará por referencia. "

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

referencia a valor $ sólo es posible si la matriz iterada se puede hacer referencia (es decir, si es una variable). El siguiente código no funcionará:

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

Aún recibo esto cuando sigo su primer ejemplo: Matriz ( .txt.gz => 101Phones - Catálogo de productos TXT .txt.gz => 1-800-FLORALS - Catálogo de productos 1 ) ¿Por qué se asigna? mi clave como el texto que estoy agregando a la variable? – user1179295

+2

si alguien tropieza con esto como yo lo hice después de mí, esta es la solución a esta pregunta la mayor parte del tiempo. OP, considere marcar esto como la respuesta correcta, si alguna vez vuelve a iniciar sesión ... – RaKXeR

3

pase $value como referencia:

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

¿Qué hay de matriz de mapa:

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

eso me está dando un error de análisis – user1179295

+0

";" faltaba, lo he corregido. –

3

Trate

$catalog = array(); 

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


print_r ($catalog); 

O

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


print_r ($store); 

depende de lo que quiere lograr

Gracias :)

+0

Su omisión de la matriz .txt.gz ( [1] => 101Phones - Catálogo de Productos TXT [2] => 1-800-Floral - Catálogo de Productos 1 ) – user1179295

+0

que no es cierto .. ver http://codepad.org/dpHjXtzz – Baba

2

Creo que esto es lo que quiere hacer:

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

unset($value); 

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

es la manera de modificar valor del elemento de matriz dentro del bucle foreach.

Cuestiones relacionadas