将二维数组数据分组为重复的二级键组

问题描述 投票:0回答:4

我正在努力处理一个数组,我需要根据唯一的数组键将其转换为新数组。每个数组仅代表所需结果的一部分。我需要 [menu_name]、[menu_url] 和 [menu_target] 作为每行的键。

我的看法是,要实现这一点,就是构造一个新数组,每次数组中都有一个

array_key_exist()
。但我无法实现这一目标。

$array = [
    ['menu_name' => 'Contact'],
    ['menu_url' => '/contact'],
    ['menu_target' => '_blank'],
    ['menu_name' => 'Home'],
    ['menu_url' => '/home'],
    ['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);
    }
}
php arrays multidimensional-array grouping recurring
4个回答
2
投票

您可以使用每次键已存在时递增的变量:

$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;
}

0
投票

另一种方式,就是如果当前一批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);

示例演示


0
投票

前提是您的答案始终按三分组,如您的示例中所示。

这是 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
        )
)

示例演示


0
投票

如果您事先不知道每个组中有多少行,则每次引用(组)与当前行的键共享键时,都将引用变量推入结果数组中。 当在每个组中遇到新键时,使用数组联合赋值运算符将新的关联元素附加到引用中。

代码:(演示

$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',
  ),
)
© www.soinside.com 2019 - 2024. All rights reserved.