Wie kann ich ein Array von Strings in ein assoziatives Array in PHP konvertieren?

Sep 04 2020

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

u_mulder Sep 04 2020 at 21:25

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 .

1 Chaz Sep 04 2020 at 21:48

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);
}

https://3v4l.org/0cnhZ

Vielleicht möchten Sie dies auch überprüfen:
PHP Split Delimited String in Schlüssel- / Wertepaare (assoziatives Array)

SureshChand Sep 04 2020 at 21:24

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()

JaredFarrish Sep 04 2020 at 21:26
$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

SlavaRozhnev Sep 04 2020 at 22:21

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);

Spielen Sie hier mit Code

core1024 Sep 04 2020 at 22:36

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.

Hier ist die letzte Geige.