I have an associative array, with some of the values in "CAT" having multiple words, separated by a comma.
I would like to split those into separate array entries (each comma separated word to create another array entry) as shown below.
I know that I can use explode()
to separate those values with commas, but not sure on how to create a new array entry from it?
$categories = explode(',', $details[0]['CAT']);
Current array structure:
Array
(
[0] => Array
(
[ID] => 50829
[CAT] => "furniture,home,garden"
)
[1] => Array
(
[ID] => 50832
[CAT] => "kids"
)
[2] => Array
(
[ID] => 50854
[CAT] => "toys"
)
)
Desired result:
Array
(
[0] => Array
(
[ID] => 50829
[CAT] => "furniture"
)
[1] => Array
(
[ID] => 50829
[CAT] => "home"
)
[2] => Array
(
[ID] => 50829
[CAT] => "garden"
)
[3] => Array
(
[ID] => 50832
[CAT] => "kids"
)
[4] => Array
(
[ID] => 50854
[CAT] => "toys"
)
)
Really appreciate your help!
You can simply use a foreach to recreate a new array. For each category in the "CSV string", you can add the "ID"+"new CAT" in the output array:
$array = [
['ID' => 50829, 'CAT' => 'furniture,home,garden'],
['ID' => 50832, 'CAT' => 'kids'],
['ID' => 50854, 'CAT' => 'toys'],
];
$out = []; // output array
foreach ($array as $item) { // for each entry of the array
$cats = explode(',', $item['CAT']); // split the categories
foreach ($cats as $cat) { // for each cat
$out[] = [ // create a new entry in output array
'ID' => $item['ID'], // with same ID
'CAT' => $cat, // the "sub" category
];
}
}
var_export(array_values($out));
array (
0 =>
array (
'ID' => 50829,
'CAT' => 'furniture',
),
1 =>
array (
'ID' => 50829,
'CAT' => 'home',
),
2 =>
array (
'ID' => 50829,
'CAT' => 'garden',
),
3 =>
array (
'ID' => 50832,
'CAT' => 'kids',
),
4 =>
array (
'ID' => 50854,
'CAT' => 'toys',
),
)
Or to create a same array without "CAT":
$out = [];
foreach ($array as $item) {
$cats = explode(',', $item['CAT']);
unset($item['CAT']); // unset the original "CAT"
foreach ($cats as $cat) {
$out[] = $item + ['CAT' => $cat]; // copy $item and add "CAT"
}
}