Agregar valor anterior en foreach - PHP

Digamos que tengo una cadena de datos como esta...

one=1&two=2&three=3&four=4&two=2

estoy usando php foreach para tomar la clave/valor y ordenar cómo lo necesito en este punto

foreach($_POST as $key => $value) {
   if ($key == "two") {
    // $result = Take $value and add it to the previous $value .",";
   }
}

El objetivo que estoy tratando de alcanzar es cómo tomo las claves duplicadas y agrego el valor anterior generado en el ciclo. Por ejemplo: La solución sería $result = 2,2,

preguntado el 22 de mayo de 12 a las 21:05

Si POSTenvió eso a su servidor, solo vería uno two, no vería ambos valores. -

Oye, para obtener acceso a la estructura de nombres de cualquier matriz, es decir, $_POST o $myarray, usa print_r y .php.net/manual/en/function.print-r.php> -

5 Respuestas

Si estás en POSTAl enviar la cadena en la pregunta a su servidor, solo vería un valor de two, no ambos. El segundo sobrescribiría el primer valor.

Si desea múltiples valores para una clave, puede convertirla en una matriz utilizando [].

one=1&two[]=2&three=3&four=4&two[]=2

Ahora, $_POST['two'] será una matriz (one, three y four serán cadenas).

contestado el 22 de mayo de 12 a las 21:05

Esto no funcionará. Solo obtiene el último valor de POST, GET y REQUEST. Debe analizar el $_SERVER['QUERY_STRING'], y si lo analizó, puede iterar su matriz:

foreach(explode('&',$_SERVER['QUERY_STRING']) as $k => $v)
{
 $val = explode('=',$v);
 $result[$val[0]] = isset($result[$val[0]]) ? $result[$val[0]].','.$val[1]:$val[1];
}

contestado el 22 de mayo de 12 a las 21:05

//initial data string
$string = "one=1&two=2&three=3&four=4&two=2";

$results = array();

$data = explode('&', $string);

foreach($data as $param) {

    $query = explode('=', $param);

    $key = $query[0];
    $value = $query[1];

    // check to see if the key has been seen before. 
    // if not, store it in an array for now.
    if(!isset($results[$key])){
        $results[$key] = array($value);
    }
    else{
        // the key is a duplicate, store it in the array
        $results[$key][] = $value;
    }

}

// implode the arrays so that they're in the $result = "2,2" format
foreach($data as $key => $value){
    $data[$key] = implode(',', $value);
}

También se ha mencionado, pero si esto proviene de una publicación del servidor, no obtendrá claves duplicadas.

contestado el 22 de mayo de 12 a las 22:05

¿No necesitas también explotar en =? - Cohete Hazmat

Sí, no había ningún signo de interrogación en la pregunta, así que lo dejé fuera de la respuesta, pero si tenía uno allí, debería quitarlo para que esto funcione: Cambio de contexto

No, quise decir que tienes que hacer list($key, $value) = explode('=', $value). (Estaba tratando de decir que necesitas explotar el signo igual. El signo de interrogación era porque estaba haciendo una pregunta :-P) - Cohete Hazmat

Teniendo en cuenta El consejo de Rocket sobre múltiples valores publicados, podría usar implode() en cualquier matriz que llegue:

foreach($_POST as $key=>$value)
{
    if(is_array($value))
        $_POST[$key]=implode(',',$value);
}

para obtener el valor de cadena que parece estar buscando.

contestado el 23 de mayo de 17 a las 13:05

Almacénelos como una matriz fuera del bucle foreach.

$keys = [];
foreach($_POST as $key => $value) {
   if ($key == "two") {
     $keys[] = $value;
   }
}
return $keys

contestado el 22 de mayo de 12 a las 21:05

No puede tener dos claves iguales en una matriz. Este código podría simplificarse hasta $keys = $_POST['two'] (esto sería una cadena, no una matriz). - Cohete Hazmat

Para su información, en php no necesita inicializar una matriz fuera de un foreach para tener acceso a la matriz. Simplemente agregue cosas a la matriz y devuélvala cuando haya terminado. - clasicojonesynz

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.