基于唯一键创建新阵列

时间:2014-07-17 07:27:50

标签: php arrays pivot

我正在努力寻找一个基于独特数组键转换成新数组的数组。我目前的结果如下所示。每个数组只代表所需结果(数据透视)的一部分,我需要[menu_name],[menu_url]和[menu_target]作为结果,当下一个数组以相同的键开始时等等。所以我看到它的方式实现这一点就是构造一个新的数组,每次都是数组中的array_key_exist。但我无法做到这一点。

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

我希望有人可以让我朝着正确的方向进一步完成具有所需结果的代码。

3 个答案:

答案 0 :(得分:2)

您可以使用每次键已存在时增加的var:

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

答案 1 :(得分:0)

如果你的答案总是按照三个分组,如你的例子中所示。

这是另一种djidi's答案的方法,如果您希望通过愚蠢的循环完成它。

    $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
        )
)

Example Demo

答案 2 :(得分:0)

另一种方法是,如果当前批次的密钥完成,请转到下一个密钥并填写下一个密钥。例如:

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

Sample Demo