2011-12-14 8 views
6

Sto provando a completare un router URL che ho creato per il mio framework MVC personalizzato. Ho una lista di parametri che ho sezionato dall'URL, ma il problema è che hanno solo le chiavi numeriche. Quello che voglio fare è configurarlo in modo che il primo valore dell'array $ params sia il KEY e quindi il secondo valore dell'array sia il VALUE del primo KEY. Ma devo andare oltre, anche oltre. Essenzialmente, ho bisogno che il valore di tutte le chiavi di numeri dispari nell'array sia il nuovo KEY e il valore della chiave di numero pari sia il valore.Riorganizzazione di un array: voci dispari come KEY, anche voci come VALUE

Esempio:

Questo è come è attualmente impostati:

Array 
(
    [0] => greeting 
    [1] => hello 
    [2] => question 
    [3] => how-are-you 
    [4] => response 
    [5] => im-fine 
) 

Ecco come deve essere (dopo la conversione):

Array 
(
    [greeting] => hello 
    [question] => how-are-you 
    [response] => im-fine 
) 

sarebbe più facile creare questo tipo di array quando esplodo la stringa dal delimitatore '/' quando la estraggo dalla stringa dell'URL? Se sì, quale sarebbe la migliore funzione per questo?

È probabilmente una soluzione semplice, perché sono sicuro che questo è un problema comune, ma qualsiasi illuminazione?

+0

penso di essere stato con voi fino a quando non dici che vuoi che il primo indice (0) sia la chiave e poi dici che vuoi che gli indici dispari siano la chiave. Intendi: partendo da zero, prendi il primo valore come chiave, il secondo come valore e inserisci una mappa, e fallo per ogni coppia chiave/valore? –

risposta

8

Forse usare array_splice() per quello?

$result = array(); 

while (count($urls)) { 
    list($key,$value) = array_splice($urls, 0, 2); 
    $result[$key] = $value; 
} 

Questo estrarrà le prime due voci dalla lista URL e usare quelli come chiave e il valore per l'array risultante. Si ripete finché l'elenco delle fonti non è vuoto.

+0

Proverò questo ... Se c'è una quantità non uniforme di voci nell'array, verrà esportato un errore? – cshoffie

+1

@cshoffie sì, lo farebbe. Come 'array_splice' darebbe un array a elemento singolo, mentre' list' si aspetta due elementi. Avrai 'Avviso: Offset non definito: 1 in .... on line ...' – Yoshi

1

Qualcosa di simile:

$data = array (
    'greeting', 
    'hello', 
    'question', 
    'how-are-you', 
    'response', 
    'im-fine', 
); 

$new = array(); 

for ($i = 0, $lim = sizeof($data); $i < $lim; $i += 2) { 
    $new[$data[$i]] = isset($data[$i + 1]) ? $data[$i + 1] : null; 
} 

print_r($new); 
0

non so se è la soluzione migliore, ma quello che ho fatto è

  $previousElement = null; 
      foreach ($features as $key => $feature) { 
       //check if key is even, otherwise it's odd 
       if ($key % 2 === 0) { 
        $features[$feature] = $feature; 
       } else { 
        $features[$previousElement] = $feature; 
       } 
       //saving element so I can "remember" it in next loop 
       $previousElement = $feature; 
       unset($features[$key]); 
      } 
0

Il modo migliore per farlo è con la suddivisione in blocchi e utilizzarlo in elenco.

$array = array("greeting", "hello", "question", "how-are-you", "response", "im-fine"); 

$assoc = array(); 
    foreach (array_chunk($array, 2) as $pair) { 
    list($key, $value) = $pair; 
    $assoc[$key] = $value; 
} 

var_export($assoc); 

/* 
    array (
     'greeting' => 'hello', 
     'question' => 'how-are-you', 
     'response' => 'im-fine', 
) 
*/ 

found here

0

solo perché nessun altro ha fatto notare, questo funziona ed è almeno altrettanto buono come il costruito nelle funzioni per le prestazioni:

$array = array("greeting", "hello", "question", "how-are-you", "response", "im-fine"); 
$res = array(); 
for($i=0; $i < count($array); $i+=2){ 
    $res[$array[$i]] = $array[$i+1]; 
}