Bagaimana saya bisa mengubah array string menjadi array asosiatif di PHP?
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
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 .
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);
}
Anda mungkin ingin memeriksanya juga:
PHP Split Delimited String menjadi Key / Value Pairs (Associative Array)
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()
$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;
}, []);
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);
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.