Bagaimana saya bisa mengubah array string menjadi array asosiatif di PHP?

Sep 04 2020

Saat ini saya memiliki array tiga string, dan tujuan saya adalah mengubah tiga string ini dari array menjadi array asosiatif individu.

Ini adalah arraynya:

$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",

Saya ingin memiliki kunci dari array asosiatif menjadi tindakan, kuantitas, kode item dll dan untuk memulai saya pikir saya harus mencoba mengubah isi array menjadi string agar lebih mudah diatur.

// Convert $arr to a string.
$imploded = implode(": ",$arr);
//echo $imploaded;
$str = $imploded;
$results = preg_split('/: [;,]/', $str);
print_r($results);

Idealnya, saya ingin array terlihat seperti ini. Saya cukup baru mengenal PHP sehingga bantuan dan saran apa pun akan sangat dihargai.

array(
    'action'    =>   '',
    'amount'    =>   '',
    'code'  =>   '',
    'name'  =>   '',
    'colour'    =>   '',
    'size'      =>   '',
);

Jawaban

u_mulder Sep 04 2020 at 21:25

Sesederhana:

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

Biola di sini .

1 Chaz Sep 04 2020 at 21:48

Ini mungkin yang Anda butuhkan:

<?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

Anda mungkin ingin memeriksanya juga:
PHP Split Delimited String menjadi Key / Value Pairs (Associative Array)

SureshChand Sep 04 2020 at 21:24

Kamu dapat memakai :

$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

Anda akan mendapatkan koleksi terpisah 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

Satu lagi solusi tanpa loop menggunakan:

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

Mainkan di sini dengan kode

core1024 Sep 04 2020 at 22:36

Hanya untuk bersenang-senang, satu cara lagi untuk melakukannya:

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

Pada dasarnya di sini kami membagi garis dengan dua pemisah yang mungkin, baik :atau ;diikuti oleh spasi.

Kemudian array_chunkfungsi mengelompokkan kunci dan nilai bersama-sama dan kami mendapatkan untuk setiap baris sesuatu seperti ini:

        Array
        (
            [0] => Array
                (
                    [0] => action
                    [1] => Added
                )

            [1] => Array
                (
                    [0] => amount
                    [1] => 1
                )
* * *

Dengan menyebarkan dan memetakan array di atas kita mendapatkan versi rotasinya seperti ini:

Array
        (
            [0] => Array
                (
                    [0] => action
                    [1] => amount
* * *
                )

            [1] => Array
                (
                    [0] => Added
                    [1] => 1
* * *
                )
        )

Kita sekarang dapat menyebarkan array ini dan meneruskannya ke array_combinefungsi sehingga kita memiliki array asosiatif yang bagus yang diisi dengan kunci dan nilai yang diinginkan.

Kemudian kami memetakan semua garis dan dengan cara ini kami mendapatkan hasil yang diformat dengan baik.

Ini biola terakhir.