我正在努力处理一个数组,我需要根据唯一的数组键将其转换为新数组。我当前的结果如下所示。每个数组仅代表所需结果(枢轴)的一部分,其中我需要 [menu_name]、[menu_url] 和 [menu_target] 作为结果,以及下一个数组以相同的键开头时等。所以我认为它是实现这一点的方法是构造一个新的数组,数组中每次存在一个array_key_。但我无法实现这一目标。
Array
(
Array
(
[menu_name] => Contact
)
Array
(
[menu_url] => /contact
)
Array
(
[menu_target] => _blank
)
Array
(
[menu_name] => Home
)
Array
(
[menu_url] => /home
)
Array
(
[menu_target] => _self
)
)
我想要创建的所需数组如下所示:
Array
(
[0] => Array
(
[menu_name] => Contact,
[menu_url] => /contact,
[menu_target] => _blank
)
[1] => Array
(
[menu_name] => Home,
[menu_url] => /home,
[menu_target] => _blank
)
)
这是我到目前为止的代码(不完整):
$result = array();
foreach($array as $option => $value)
{
$result[$value->option_key] = $value->option_value;
$new_array = array();
if(array_key_exist($value->option_key, $new_array))
{
// here is where I get stuck….
print_r($new_array);
}
}
我希望有人能让我朝着正确的方向进一步完成代码并获得所需的结果。
您可以使用每次键已存在时递增的变量:
$result = array();
$i = 0;
foreach($array as $option => $value)
{
if ( array_key_exists($value->option_key, $result[$i]) ) $i++;
$result[$i][$value->option_key] = $value->option_value;
}
另一种方式,就是如果当前一批key已经完成,就转到下一批,将下一批填满。示例:
$values = array(array('menu_name' => 'Contact'),array('menu_url' => '/contact'),array('menu_target' => '_blank'),array('menu_name' => 'Home'),array('menu_url' => '/home'),array('menu_target' => '_self'),);
$new_values = array();
$x = 0;
$columns = array_unique(array_map(function($var){
return key($var);
}, $values));
foreach($values as $value) {
$current_key = key($value);
$new_values[$x][$current_key] = reset($value);
if(array_keys($new_values[$x]) == $columns) $x++;
}
echo '<pre>';
print_r($new_values);
前提是您的答案始终按三分组,如您的示例中所示。
这是 djidi 答案的替代方法,以防您想看到它通过愚蠢的循环完成。
$new = array_chunk($a, 3);
$d = array();
foreach($new as $i => $group) {
foreach($group as $index => $item) {
foreach($item as $name=>$val) {
$d[$i][$name] = $val;
}
}
}
返回:
Array
(
[0] => Array
(
[menu_name] => Contact
[menu_url] => /contact
[menu_target] => _blank
)
[1] => Array
(
[menu_name] => Home
[menu_url] => /home
[menu_target] => _self
)
)
如果您事先不知道每个组中有多少行,则每次引用(组)与当前行的键共享键时,都将引用变量推入结果数组中。 当在每个组中遇到新键时,使用数组联合赋值运算符将新的关联元素附加到引用中。
代码:(演示)
$array = [
['menu_name' => 'Contact'],
['menu_url' => '/contact'],
['menu_target' => '_blank'],
['menu_name' => 'Home'],
['menu_url' => '/home'],
['menu_target' => '_self'],
];
$result = [];
foreach ($array as $row) {
if (!isset($ref) || key_exists(key($row), $ref)) {
unset($ref);
$ref = $row;
$result[] =& $ref;
continue;
}
$ref += $row;
}
var_export($result);
如果你知道这些组总是有 3 个元素,那么只需分块并展平即可。 (演示)
var_export(
array_map(
fn($chunk) => array_merge(...$chunk),
array_chunk($array, 3)
)
);
两个输出:
array (
0 =>
array (
'menu_name' => 'Contact',
'menu_url' => '/contact',
'menu_target' => '_blank',
),
1 =>
array (
'menu_name' => 'Home',
'menu_url' => '/home',
'menu_target' => '_self',
),
)