Stringa di query di analisi in un array


196

Come posso trasformare una stringa di seguito in un array ?

pg_id=2&parent_id=2&document&video 

Questo è l'array che sto cercando,

array(
    'pg_id' => 2,
    'parent_id' => 2,
    'document' => ,
    'video' =>
)

Risposte:


331

Si desidera la parse_strfunzione ed è necessario impostare il secondo parametro affinché i dati vengano inseriti in un array anziché in singole variabili.

$get_string = "pg_id=2&parent_id=2&document&video";

parse_str($get_string, $get_array);

print_r($get_array);

2
Ho un problema con questa risposta, perché non funziona se si utilizza più volte la stessa chiave (sì, perché le chiavi dell'array php sono uniche). Quindi ?key=lorem&key=ipsumsi tradurrà in array(["key"]=>"ipsum")La domanda è, c'è una funzione per ottenere s.th. come questo array(["key"]=>array("lorem", "ipsum"))o devo creare questa funzione da solo?
MaBi

11
Tecnicamente PHP tratterà anche ?key=lorem&key=ipsumcome se fornissi solo key=ipsumse quella fosse la stringa di query sull'URL. E penso che sia considerato non valido riutilizzare la chiave e aspettarsi risultati coerenti o che tutte le istanze della chiave vengano conservate. L'approccio valido, almeno per una stringa di query inviata a PHP, sarebbe ?key[]=lorem&key[]=ipsum, quindi l'approccio nostrano potrebbe cercare eventuali occorrenze in &{x}=cui x si verifica più di una volta e sostituirlo con x[](e trattando? Uguale a &)
Anthony

9
@Mabi - oh, guarda, qualcun altro è d'accordo con te e ha già creato la propria funzione - php.net/manual/en/function.parse-str.php#76792
Anthony

È stato utile! Ho deciso di farlo in questo modo ?key[]=lorem&key[]=ipsumalcune settimane fa. Ma grazie per aver condiviso il link!
MaBi,

2
Qualcosa a cui prestare attenzione sono le stringhe che includono '+', come myemail+alias@gmail.com. Questi saranno analizzati da parse_str in uno spazio. key = myemail alias@gmail.com.
Dudeman,

62

A volte da parse_str()solo è preciso delle note, potrebbe essere visualizzato ad esempio:

$url = "somepage?id=123&lang=gr&size=300";

parse_str () restituisce:

Array ( 
    [somepage?id] => 123 
    [lang] => gr 
    [size] => 300 
)

Sarebbe meglio combinare parse_str()con parse_url()questo modo:

$url = "somepage?id=123&lang=gr&size=300";
parse_str( parse_url( $url, PHP_URL_QUERY), $array );
print_r( $array );

3
Immagino che ci si aspetti$_SERVER['QUERY_STRING']
CpILL

come eseguire l'array per l'URL della stringa ex. : Array ([somepage? Id] => 123 [lang] => gr [size] => 300) output = somepage? Id = 123 & lang = gr & size = 300
mehul



17

Se hai problemi a convertire una stringa di query in un array a causa di e commerciali codificate

&

quindi assicurati di usare html_entity_decode

Esempio:

// Input string //
$input = 'pg_id=2&parent_id=2&document&video';

// Parse //
parse_str(html_entity_decode($input), $out);

// Output of $out //
array(
  'pg_id' => 2,
  'parent_id' => 2,
  'document' => ,
  'video' =>
)


3

Questa è una riga per l'analisi della query dall'URL corrente nell'array:

parse_str($_SERVER['QUERY_STRING'], $query);

1

Puoi usare la funzione stringa PHP parse_str()seguita da foreachloop.

$str="pg_id=2&parent_id=2&document&video";
parse_str($str,$my_arr);
foreach($my_arr as $key=>$value){
  echo "$key => $value<br>";
}
print_r($my_arr);

-3

Questo è il codice PHP per dividere la query in mysql & mssql

enter code here
function splitquery($strquery)
{
$arrquery=explode('select',$strquery);

$stry='';$strx='';

for($i=0;$i<count($arrquery);$i++)
{
if($i==1)
{
    echo 'select '.trim($arrquery[$i]);
}
elseif($i>1)
{

$strx=trim($arrquery[($i-1)]);

    if(trim(substr($strx,-1))!='(')
    {
        $stry=$stry.'

select '.trim($arrquery[$i]);
    }
    else
    {
        $stry=$stry.trim('select '.trim($arrquery[$i]));
    }

$strx='';
}
} 

return $stry;
}

Esempio:

Domanda prima

seleziona xx da xx seleziona xx, (seleziona xx) da xx dove y = 'cc' seleziona xx da xx left join (seleziona xx) dove (seleziona top 1 xxx da xxx) oder da xxx desc ";

Quesito dopo

seleziona xx da xx

seleziona xx, (seleziona xx) da xx dove y = 'cc'

selezionare xx da xx join sinistro (selezionare xx) dove (selezionare top 1 xxx da xxx) o da xxx desc

Grazie, dall'Indonesia Sentrapedagang.com


-5

Per questa domanda specifica la risposta scelta è corretta ma se esiste un parametro ridondante, come una "e" extra, nell'URL la funzione fallirà silenziosamente senza generare un errore o un'eccezione:

a=2&b=2&c=5&d=4&e=1&e=2&e=3 

Quindi preferisco usare il mio parser in questo modo:

//$_SERVER['QUERY_STRING'] = `a=2&b=2&c=5&d=4&e=100&e=200&e=300` 

$url_qry_str  = explode('&', $_SERVER['QUERY_STRING']);

//arrays that will hold the values from the url
$a_arr = $b_arr = $c_arr = $d_arr = $e_arr =  array();

foreach( $url_qry_str as $param )
    {
      $var =  explode('=', $param, 2);
      if($var[0]=="a")      $a_arr[]=$var[1];
      if($var[0]=="b")      $b_arr[]=$var[1];
      if($var[0]=="c")      $c_arr[]=$var[1];
      if($var[0]=="d")      $d_arr[]=$var[1];
      if($var[0]=="e")      $e_arr[]=$var[1];
    }

    var_dump($e_arr); 
    // will return :
    //array(3) { [0]=> string(1) "100" [1]=> string(1) "200" [2]=> string(1) "300" } 

Ora hai tutte le occorrenze di ciascun parametro nel suo array, puoi sempre unirle in un array se vuoi.

Spero che aiuti!


Non si dovrebbe mai avere lo stesso nome di parametro di query con valori diversi. Non ha senso poiché solo uno verrà accettato comunque.
Cristian

3
@Cristian: "Non dovresti mai avere lo stesso nome param della query con valori diversi". Hai ragione, ma la risposta afferma: "... l'URL della funzione fallirà silenziosamente senza generare un errore o un'eccezione." Il che potrebbe interrompere un'applicazione. Sebbene questa risposta non sia eccezionale, evidenzia un problema. Soprattutto se la tua applicazione può essere arrestata in modo anomalo da qualcuno che sta semplicemente facendo una richiesta arbitrariamente con parametri aggiuntivi
inseriti
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.