Come posso convertire un array di stringhe in un array associativo in PHP?

Sep 04 2020

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

u_mulder Sep 04 2020 at 21:25

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 .

1 Chaz Sep 04 2020 at 21:48

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)

SureshChand Sep 04 2020 at 21:24

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

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

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

core1024 Sep 04 2020 at 22:36

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.