Closed. This question needs to be more focused. It is not currently accepting answers.
Want to improve this question? Update the question so it focuses on one problem only by editing this post.
Closed 6 years ago.
Improve this question
I have a database table that would return an array something like this
$roles['admin'] = 'app1,app2,app3';
$roles['moderator'] = 'app2,app3';
Now I want to traverse this array to show in my view, But instead of showing all apps inside each role, i would like to show all roles inside each app.
So ideally i would like the above array to become this
$apps['app1'] = 'admin';
$apps['app2'] = 'admin,moderator';
$apps['app3'] = 'admin,moderator';
I have been trying to solve this for 2 hours now, but for some reason I can't find an efficient way of doing this.
The following will traverse your array and load it into the appropriate array. It works by going through each part of the array and traversing it.
<?php
$apps = array();
foreach($roles as $key1 => $value1){
$parts = explode(',', $value1);
foreach($parts as $key2 => $value2){
$apps[$value2] .= (strlen($apps[$value2])>0)?",":"").$key1;
}
}
?>
You can map one array to the other by using array_reduce, array_keys and explode to turn your CSV values into arrays
$apps = array_reduce(array_keys($roles), function($apps, $key) use ($roles) {
foreach (explode(',', $roles[$key]) as $app) $apps[$app][] = $key;
return $apps;
}, []);
Note that the result is slightly different to what you wanted in that the values are themselves arrays instead of comma separated strings.
Array
(
[app1] => Array
(
[0] => admin
)
[app2] => Array
(
[0] => admin
[1] => moderator
)
[app3] => Array
(
[0] => admin
[1] => moderator
)
)
If you really need CSV values, add this
$apps = array_map(function($list) {
return implode(',', $list);
}, $apps);
which produces
Array
(
[app1] => admin
[app2] => admin,moderator
[app3] => admin,moderator
)
Related
Closed. This question needs to be more focused. It is not currently accepting answers.
Want to improve this question? Update the question so it focuses on one problem only by editing this post.
Closed 1 year ago.
Improve this question
I have an array like below and its dynamic array.
$array = [10,20,30,40,50];
I want to create an another array recursively using the above array values. Looks like below
Array
(
[10] => Array
(
[20] => Array
(
[30] => Array
(
[40] => Array
(
[50] => Array
(
[label] => LABEL
)
)
)
)
)
)
Can anyone help / assist for the above query?
Your help very much appreciated.
Thanks in advance.
It's just a loop, not recursive. If it was recursive you'd need 2 functions or call the same function from within itself. This looks a bit like that, but it's just a loop.
Iterate through each number and create a new array using the number as the key and the accumulating array as the value. Doing it this way means that the first item in the original array will be the deepest item in the finished array, so array_reverse is needed to get it the way you described.
$array = [10,20,30,40,50];
$newarray=[];
foreach (array_reverse($array) as $number) $newarray = [$number => $newarray];
print_r($newarray);
https://www.tehplayground.com/bya12n5tV0jjcAvA
<?php
$array = [10, 20, 30, 40, 50];
$matrix = []; // Final result.
$pointer = &$matrix; // Reference of deepest array.
foreach ($array as $item) {
$pointer[$item] = []; // Create a deeper array.
$pointer = &$pointer[$item]; // Move the reference to the deeper array.
}
$pointer['label'] = "LABEL";
// Print result.
print(json_encode($matrix, JSON_PRETTY_PRINT));
Output
{
"10": {
"20": {
"30": {
"40": {
"50": {
"label": "LABEL"
}
}
}
}
}
}
Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 1 year ago.
Improve this question
I want to generate a nested array from a string.
The String looks like this
$item = "profile:my_wallet:btn_recharge";
I want to convert it to nested array like this
["profile"]["my_wallet"]["btn_recharge"]
What you could use is a simple recursion to go as deep as you like.
function append(array $items, array $array = []): array
{
$key = array_shift($items);
if (!$key) return $array;
$array[$key] = append($items, $array);
return $array;
}
$array = append(explode(':', "profile:my_wallet:btn_recharge"));
The result of $array looks like below and can be accessed as you asked
$array['profile']['my_wallet']['btn_recharge'];
array (
'profile' =>
array (
'my_wallet' =>
array (
'btn_recharge' =>
array (
),
),
),
)
Closed. This question needs to be more focused. It is not currently accepting answers.
Want to improve this question? Update the question so it focuses on one problem only by editing this post.
Closed 2 years ago.
Improve this question
I have array like below:
$arr=[["id"=>"001","name"=>"Hello","pict"=>"hello.jpg"],["id"=>"002","name"=>"Abc","pict"=>"abc.jpg"]];
i want to add one more element to array $arr by "link"=>"uploads/hello.jpg"
My expected result:
$arr=[["id"=>"001","name"=>"Hello","pict"=>"hello.jpg","link"=>"uploads/hello.jpg"],["id"=>"002","name"=>"Abc","pict"=>"abc.jpg","link"=>"uploads/abc.jpg"]];
Any solution for this thank.
You can iterate over the array using foreach, passing a reference into the loop to allow the values to be modified directly:
$arr=[["id"=>"001","name"=>"Hello","pict"=>"hello.jpg"],["id"=>"002","name"=>"Abc","pict"=>"abc.jpg"]];
foreach ($arr as &$a) {
$a['link'] = 'uploads/' . $a['pict'];
}
print_r($arr);
Output:
Array
(
[0] => Array
(
[id] => 001
[name] => Hello
[pict] => hello.jpg
[link] => uploads/hello.jpg
)
[1] => Array
(
[id] => 002
[name] => Abc
[pict] => abc.jpg
[link] => uploads/abc.jpg
)
)
Demo on 3v4l.org
You can iterate over each element in the array and set it that way.
for ($i = 0; $i < count($arr); i++) {
$arr[$i]['link'] = 'uploads/'.$arr[$i]['pict'];
}
foreach($arr as $key => $value){
$arr[$key]['link'] = "uploads/".$value['pict'];
}
Use the foreach loop to modify the original array. The $key value is used to refer to each index in the array.
Closed. This question needs to be more focused. It is not currently accepting answers.
Want to improve this question? Update the question so it focuses on one problem only by editing this post.
Closed 5 years ago.
Improve this question
I confused how to make depth from basic array.
$array = array('736', '827', '831');
With foreach loop, I want final result like this:
Array
(
[736] => Array
(
[827] => Array
(
[831] => Array
(
)
)
)
)
Just like you want them, do this:
array
(
736 => array
(
827 => array
(
831 => array
(
)
)
)
)
or did I misunderstand the question?
using a foreach backwards:
$arr=array(831,827,736);
$newref=array();
foreach($arr as $el)
{
$newref=array($el=>$newref);
}
for reversing an array: $arr=array_reverse($arr);
Possibly not the most efficient, but something like this should do it.
function nestedArray($array) {
$newArray = [];
$pointer = &$newArray;
foreach($array as $value) {
$pointer[$value] = [];
$pointer = &$pointer[$value];
}
return $newArray;
}
$arr = [736, 827, 831];
var_dump(nestedArray($arr));
Closed. This question needs to be more focused. It is not currently accepting answers.
Want to improve this question? Update the question so it focuses on one problem only by editing this post.
Closed 6 years ago.
Improve this question
I've got an unusual problem, but I'm fairly certain it's not impossible to solve.
Consider the two arrays below.
Array ( [0] => 1 [1] => 2 [2] => 2 )
Array ( [0] => 879 [1] => 482 [2] => 1616 )
I need to add the values in second array where the values in the first array are the same so that I would end up with...
Array ( [0] => 879 [1] => 2098 )
How might this be accomplished? Thanks in advance!
This isn't a full-proof way of completing this task, but it achieves the goal you desire. What's happening here is we're looping through your first array (the keys) and using the set values of these keys to add the values from the second array:
$new = array();
foreach($keys as $i => $key) {
if(!isset($new[$key])) { $new[$key] = 0; }
$new[$key] += $vals[$i];
}
Example/Demo
Notes
$keys being your first array: $keys = array(1, 2, 2);
$vals being your second array: array (879, 482, 1616);
As I stated, this isn't full-proof. You will need to modify it to ensure integrity, but it is a start that shows the flow of how you can go about doing what you require.