I have an array that looks like the following:
Array
(
[owner] => user_id
[add_owner] => imagetype
[cache] => cc118e60798c3369f4cc0a544f671e9c
[link] => Array
(
[0] => http://cibooo
[1] => http://teamimage
)
[imagetype] => Array
(
[0] => 8
[1] => 9
)
[email] => Array
(
[0] => cibooo@mai.com
)
)
As you see some keys have more than one values. What I want to do is that when the array contains keys with more values inside, the following array will be generated.
Array
(
[images] => Array
(
[owner] => user_id
[add_owner] => imagetype
[link] => http://cibooo
[imagetype] => 8
[email] => cibooo@mai.com
)
[images] => Array
(
[owner] => user_id
[add_owner] => imagetype
[link] => http://teamimage
[imagetype] => 9
[email] => cibooo@mai.com
)
)
Now what I did is the following:
foreach ($updates as $update) {
if (isset($data[$update['start_param']]) || $update['start_param'] == 'any') {
/*
* We check if the update input value is empty, if so
* we replace it with an alternative value.
* This alternative value can be the value of the input data
* in the case that it's available, if not it is replaced
* with the value of the input data that corresponds to the
* start_param of each update input.
* If the start_param is 'any' it gets ignored.
*/
$update_value_alternative = isset($data[$update['name']]) ? $data[$update['name']] : isset($data[$update['start_param']]) ? $data[$update['start_param']] : NULL;
$update_value = !$this->check->isEmpty($update['value']) ? $update['value'] : $update_value_alternative;
/*
* owner and add_owner must be the same for the update inputs
* of the same table, so we do not mind if the $vals['owner']
* and $vals['add_owner'] is replaced on each loop for the update inputs
* of the same table.
*/
$vals['owner'] = $update['owner'];
$vals['add_owner'] = $update['add_owner'];
/*
* We add the cache on each loop, will be deleted for
* those tables that do not contain a cache column.
*/
$vals['cache'] = $this->generate('generate->hash');
/*
* The names of all the update inputs and their relative
* values.
* The values are passed through the generate() method
* in order to generate a unique ID or a specific value
* based on what has been inserted in each specific update
* input value. Example: generate->hash
*/
$vals[$update['name']][] = $this->generate($update_value, $update['owner'], $request, $data);
$tables[$update['table']] = $vals;
}
}
At the very bottom of the script you see how I am generating the array. The problem is that the final array is the following, instead of creating a different array when more values are found for each key on the $updates
array. I need to understand how to create a different array $tables[$update['table']]
when the $vals[$update['name']][]
contains more values for each key. How can I achieve that?
This is the array I am getting with my code.
Array
(
[images] => Array
(
[owner] => user_id
[add_owner] => imagetype
[cache] => 8669e31741b5d7c0f471167dca38cd4e
[link] => Array
(
[0] => http://cibooo
[1] => http://teamimage
)
[imagetype] => Array
(
[0] => 8
[1] => 9
)
[email] => Array
(
[0] => cibooo@mai.com
)
)
)
This is very tricky because if you have 3 links 2 images types one email what happens ? I would suggest you use permutations instead to generate different possibilities rather just pad the elements.
What do i mean ?
$data = array(
'owner' => 'user_id',
'add_owner' => 'imagetype',
'cache' => 'cc118e60798c3369f4cc0a544f671e9c',
'link' => array( // 2 elements
'http://cibooo',
'http://teamimage'
),
'imagetype' => array( // 3 elements
8,
9,
10
),
'email' => array(
'cibooo@mai.com' // 1 element
)
);
How do you combine the above array ?
Using the format above it would lead to inconsistent possibility here is what i think should be done :
unset($data['cache']);
$values = array_filter($data, "is_array");
$keys = array_keys($values);
$new = array();
foreach(permutations($values) as $v) {
$new[] = array_merge($data, array_combine($keys, $v));
}
print_r($new);
Output
Array
(
[0] => Array
(
[owner] => user_id
[add_owner] => imagetype
[link] => http://cibooo
[imagetype] => 8
[email] => cibooo@mai.com
)
[1] => Array
(
[owner] => user_id
[add_owner] => imagetype
[link] => http://teamimage
[imagetype] => 8
[email] => cibooo@mai.com
)
[2] => Array
(
[owner] => user_id
[add_owner] => imagetype
[link] => http://cibooo
[imagetype] => 9
[email] => cibooo@mai.com
)
[3] => Array
(
[owner] => user_id
[add_owner] => imagetype
[link] => http://teamimage
[imagetype] => 9
[email] => cibooo@mai.com
)
[4] => Array
(
[owner] => user_id
[add_owner] => imagetype
[link] => http://cibooo
[imagetype] => 10
[email] => cibooo@mai.com
)
[5] => Array
(
[owner] => user_id
[add_owner] => imagetype
[link] => http://teamimage
[imagetype] => 10
[email] => cibooo@mai.com
)
)
Function Used
function permutations($lists) {
$permutations = array();
$iter = 0;
while(true) {
$num = $iter ++;
$pick = array();
foreach($lists as $l) {
$r = $num % count($l);
$num = ($num - $r) / count($l);
$pick[] = $l[$r];
}
if ($num > 0)
break;
$permutations[] = $pick;
}
return $permutations;
}
A lot of assumptions:
assuming that there will always be the same amount of imagetype, and links with the same index,
assuming that there will always be one email, as well as every other properties,
you can just iterate through the imagetype (that is essentially what you're splitting up).
eg:
//using your original array as $input:
$result = array();
$result["images"] = array();
$count = 0;
foreach($input["imagetype"] as $image_type) {
$result["images"][] = array(
"owner" => $input['owner'],
"add_owner" => $input['add_owner'],
"link" => $input['link'][$count],
"imagetype" => $image_type,
"email" => $input['email']
);
++$count;
}
print_r($result);