Come posso convertire un array di stringhe in un array associativo in PHP?
Al momento ho un array di tre stringhe e il mio obiettivo è trasformare queste tre stringhe dall'array in array associativi individuali.
Questo è l'array:
$arr = array(
"action: Added; amount: 1; code: RNA1; name: Mens Organic T-shirt; colour: White; size: XL",
"action: Subtracted; amount: 7; code: RNC1; name: Kids Basic T-shirt; colour: Denim Blue; size: 3-4y",
"action: Added; amount: 20; code: RNV1; name: Gift Voucher; style: Mens; value: £20",
Vorrei che la chiave dell'array associativo fosse l'azione, la quantità, il codice dell'elemento ecc. E per iniziare ho pensato di provare a trasformare il contenuto dell'array in una stringa per renderlo più gestibile.
// Convert $arr to a string.
$imploded = implode(": ",$arr);
//echo $imploaded; $str = $imploded; $results = preg_split('/: [;,]/', $str); print_r($results);
Idealmente, mi piacerebbe che l'array fosse simile a questo. Sono abbastanza nuovo in PHP, quindi qualsiasi aiuto e consiglio sarebbe molto apprezzato.
array(
'action' => '',
'amount' => '',
'code' => '',
'name' => '',
'colour' => '',
'size' => '',
);
Risposte
Semplice come:
$arr = array( "action: Added; amount: 1; code: RNA1; name: Mens Organic T-shirt; colour: White; size: XL", "action: Subtracted; amount: 7; code: RNC1; name: Kids Basic T-shirt; colour: Denim Blue; size: 3-4y", "action: Added; amount: 20; code: RNV1; name: Gift Voucher; style: Mens; value: £20", ); $data = [];
foreach ($arr as $line) {
$newItem = []; foreach (explode(';', $line) as $item) { $parts = explode(':', $item); $newItem[trim($parts[0])] = trim($parts[1]);
}
$data[] = $newItem;
}
print_r($data);
Vieni qui .
Questo potrebbe essere ciò di cui hai bisogno:
<?php
$arr = array( "action: Added; amount: 1; code: RNA1; name: Mens Organic T-shirt; colour: White; size: XL", "action: Subtracted; amount: 7; code: RNC1; name: Kids Basic T-shirt; colour: Denim Blue; size: 3-4y", "action: Added; amount: 20; code: RNV1; name: Gift Voucher; style: Mens; value: £20" ); foreach ($arr as $string) { //Build array preg_match_all("/ [ ]?([^:]+): ([^;]+)[ ;]? /x", $string, $p); $array = array_combine($p[1], $p[2]);
//Print it or do something else with it
print_r($array);
}
https://3v4l.org/0cnhZ
Potresti voler controllare anche questo:
PHP Split Delimited String in Key / Value Pairs (Associative Array)
Puoi usare :
$tempArray = array(); foreach($arr as $data){ $dataExplode = explode(';', $data); $temp = array();
foreach($dataExplode as $key => $child){ $childExplode = explode(':', $child); $temp[$childExplode[0]] = $childExplode[1];
}
array_push($tempArray, $temp);
}
print_r($tempArray); //to print array collection
Otterrai una raccolta di file separati array()
$arr = [ "action: Added; amount: 1; code: RNA1; name: Mens Organic T-shirt; colour: White; size: XL", "action: Subtracted; amount: 7; code: RNC1; name: Kids Basic T-shirt; colour: Denim Blue; size: 3-4y", "action: Added; amount: 20; code: RNV1; name: Gift Voucher; style: Mens; value: £20", ]; $keyed = array_reduce($arr, function($collector, $value) { $collector[] = array_reduce(explode('; ', trim($value, '; ')), function($collector, $value) { $parts = explode(': ', $value); $collector[$parts[0]] = $parts[1];
return $collector; }, []); return $collector;
}, []);
https://3v4l.org/lLl6T
Un'altra soluzione senza loop utilizzando:
$res = array_reduce( $arr,
function($acc, $item) {
$s = array_reduce( explode(';', $item),
function($a, $el) {
$p = explode(': ', $el);
$a[trim($p[0])] = trim($p[1]); return $a;
},
[]
);
array_push($acc, $s);
return $acc; }, [] ); print_r($res);
Gioca qui con il codice
Solo per divertimento un altro modo per farlo:
$arr = array( "action: Added; amount: 1; code: RNA1; name: Mens Organic T-shirt; colour: White; size: XL", "action: Subtracted; amount: 7; code: RNC1; name: Kids Basic T-shirt; colour: Denim Blue; size: 3-4y", "action: Added; amount: 20; code: RNV1; name: Gift Voucher; style: Mens; value: £20", ); $result = array_map(function($line) { return array_combine(...array_map(null, ...array_chunk(preg_split('/[:;]\s+/', $line), 2)));
}, $arr); print_r($result);
Fondamentalmente qui abbiamo diviso la linea dai due possibili separatori :o ;seguiti da spazi.
Quindi la array_chunkfunzione raggruppa la chiave ei valori insieme e otteniamo per ogni riga qualcosa del genere:
Array
(
[0] => Array
(
[0] => action
[1] => Added
)
[1] => Array
(
[0] => amount
[1] => 1
)
* * *
Diffondendo e mappando l'array sopra otteniamo la sua versione ruotata in questo modo:
Array
(
[0] => Array
(
[0] => action
[1] => amount
* * *
)
[1] => Array
(
[0] => Added
[1] => 1
* * *
)
)
Ora possiamo diffondere questo array e passarlo alla array_combinefunzione in modo da avere un bel array associativo riempito con le chiavi e i valori desiderati.
Quindi mappiamo tutte le linee e in questo modo otteniamo il risultato ben formattato.
Ecco il violino finale.