确定共享相同密钥结构的多个阵列中的一个密钥是否相同?

时间:2018-04-16 15:26:08

标签: php arrays multidimensional-array

这是一个示例数组,将用于形成另一个数组:

$array = [
    ['name' => 'POST', 'value' => 'lorem ipsum 1'],
    ['name' => 'POST', 'value' => 'lorem ipsum 2'],
    ['name' => 'NOT_POST', 'value' => 'lorem ipsum 3'],
]

现在,生成的数组将基于上面的数组创建,如下所示:

$resultingArray = [
    'POST' => [
        ['value' => 'lorem ipsum 1'],
        ['value' => 'lorem ipsum 2'],
    ],
    'NOT_POST' => ['value => 'lorem ipsum 3']
]

我的问题是,当我为for启动$resultingAraray循环时,我无法找到一种方法来查看即将进行的迭代的键,以便创建{{1}然后将使用相同键的多个数组填充键,而不重复键(因为PHP会选择最后一个POST键)。

所以我的问题是:在开始添加POST数组之前,如何确定不同阵列上有多个相同的name个密钥?

显然我的数组有点复杂,但$resultingArray密钥在所有这些密钥之间共享,就像在示例中一样。

2 个答案:

答案 0 :(得分:0)

而不是for使用foreach

foreach ($resultingArray as $key => $value) {
    echo 'Under key ' . $key . ' you have: '; 
    print_r($value);
}

如果您对如何创建 $resultingArray提出质疑,那么您应该说明更清楚

$resultingArray = [];
foreach ($array as $item) {
    if (empty($resultingArray[$item['name']])) {
        $resultingArray[$item['name']] = [];
    }

    $resultingArray[$item['name']][] = ['value' => $item['value']];
}

答案 1 :(得分:0)

您可以使用foreach遍历$array,存储name密钥,检查$resultingArray上是否存在密钥。如果没有,请将当前数组添加到其中,否则,添加一个级别以推送新的数组。

$array = [
    ['name' => 'POST', 'value' => 'lorem ipsum 1'],
    ['name' => 'POST', 'value' => 'lorem ipsum 2'],
    ['name' => 'NOT_POST', 'value' => 'lorem ipsum 3'],
];

$resultingArray = [];
foreach ($array as $item) {
    // get the name
    $name = $item['name'] ;
    // remove name from array
    unset($item['name']);
    // if already exists,
    if (isset($resultingArray[$name])) {
        // transform as array
        $resultingArray[$name] = [$resultingArray[$name]];
        // and push the new one
        $resultingArray[$name][] = $item ;
    } else {
        // store 'as value'
        $resultingArray[$name] = $item;
    }
}
print_r($resultingArray);

输出:

Array
(
    [POST] => Array
        (
            [0] => Array
                (
                    [value] => lorem ipsum 1
                )

            [1] => Array
                (
                    [value] => lorem ipsum 2
                )

        )

    [NOT_POST] => Array
        (
            [value] => lorem ipsum 3
        )

)