Wie kann ich ein Array von Strings in ein assoziatives Array in PHP konvertieren?
Ich habe derzeit ein Array mit drei Zeichenfolgen. Mein Ziel ist es, diese drei Zeichenfolgen aus dem Array in einzelne assoziative Arrays umzuwandeln.
Dies ist das 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",
Ich möchte, dass der Schlüssel des assoziativen Arrays die Aktion, Menge, Artikelcode usw. ist, und zu Beginn dachte ich, ich sollte versuchen, den Inhalt des Arrays in eine Zeichenfolge umzuwandeln, um es übersichtlicher zu machen.
// Convert $arr to a string.
$imploded = implode(": ",$arr);
//echo $imploaded;
$str = $imploded;
$results = preg_split('/: [;,]/', $str);
print_r($results);
Idealerweise möchte ich, dass das Array so aussieht. Ich bin ziemlich neu in PHP, daher wäre jede Hilfe und jeder Rat sehr dankbar.
array(
'action' => '',
'amount' => '',
'code' => '',
'name' => '',
'colour' => '',
'size' => '',
);
Antworten
So einfach wie:
$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);
Geige hier .
Dies kann sein, was Sie brauchen:
<?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);
}
Vielleicht möchten Sie dies auch überprüfen:
PHP Split Delimited String in Schlüssel- / Wertepaare (assoziatives Array)
Sie können verwenden:
$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
Sie erhalten eine Sammlung von separaten 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;
}, []);
Eine weitere Lösung ohne Schleifen mit:
$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);
Nur zum Spaß noch eine Möglichkeit:
$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);
Grundsätzlich teilen wir hier die Linie entweder durch die beiden möglichen Trennzeichen :oder ;gefolgt von Leerzeichen.
Dann array_chunkgruppiert die Funktion den Schlüssel und die Werte und wir erhalten für jede Zeile ungefähr Folgendes:
Array
(
[0] => Array
(
[0] => action
[1] => Added
)
[1] => Array
(
[0] => amount
[1] => 1
)
* * *
Durch Verteilen und Zuordnen des obigen Arrays erhalten wir die gedrehte Version wie folgt:
Array
(
[0] => Array
(
[0] => action
[1] => amount
* * *
)
[1] => Array
(
[0] => Added
[1] => 1
* * *
)
)
Wir können dieses Array jetzt verteilen und an die array_combineFunktion übergeben, sodass wir ein schönes assoziatives Array haben, das mit den gewünschten Schlüsseln und Werten gefüllt ist.
Dann ordnen wir alle Linien zu und erhalten so das schön formatierte Ergebnis.