当数组键是数字时,如何调用特定数组

时间:2014-04-12 15:08:48

标签: php arrays multidimensional-array

当数组键是数字时,如何调用特定数组。我的数组看起来像这样:

我的数组等于$ output:

Array
(
    [7] = Array
        (
            [name] = Grill Specifications
            [attributes] = Array
                (
                    [46] = Array
                        (
                            [name] = Fuel Type
                            [values] = Array
                                (
                                    [0] = Charcoal,Natural Gas,Combo
                                    [1] = Charcoal,Propane,Combo
                                    [2] = Charcoal,Propane,Natural Gas,Combo
                                    [3] = Natural Gas
                                    [4] = Natural Gas,Propane
                                    [5] = Propane
                                    [6] = Propane,Natural Gas
                                )

                        )

依此类推......我有很多......

我需要做的是获取[values]的所有键并展开那些带逗号的键的值。然后让它们都独一无二。我不知道如何调用这些数组而不必像这样输入数字:$output[7][attributes][46][values]

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:0)

function extractUniques(array $array) {
    $values = [];
    $callback = function(array $array) use (&$callback, &$values) {
        foreach ($array AS $key => $value) {
            $isArray = is_array($value);
            if (strcasecmp($key, 'value') === 0 && $isArray) {
                foreach ($value AS $item) {
                    if (is_scalar($item)) {
                        $values = array_merge($values, explode(',', (string) $item));
                    }
                }
            } else if ($isArray) {
                $callback($value);
            }
        }
    };
    $callback($array);
    $trimmed = array_map(function($value) {
        return trim($value);
    }, $values);
    return array_unique($trimmed);
}

此函数以递归方式遍历数组并搜索等于" value"的键,如果找到数组,则迭代它们并使用逗号作为分隔符展开每个标量元素。最后修剪所有字符串并返回唯一的元素列表。

用法:

$uniques = extractUniques($output);
var_dump($uniques);

此外,您可能需要一个相当新版本的PHP。 5.3或5.4应该可以正常工作。如果它不起作用,你可以从替换$ values = []开始; with $ values = array();并用实际函数替换$ callback,这样你就不会使用闭包。

答案 1 :(得分:0)

如果您在树中有一个特定的数组,并且您只想读取值,只需将子数组分配给变量。

$values = $output[7]['attributes'][46]['values'];

(请注意,这些键的任何可以是变量。例如,如果$id === 7$key === 'attributes',您可以说$values = $output[$id][$key][46]['values'];做同样的事情。)

现在你可以只看$values而不是每次都在树上偷窥,因为每一个都是另一个的副本。

assert('$values[0] === $output[7]["attributes"][46]["values"][0]');

如果您需要能够更改数组,您可以使用引用代替......

$values =& $output[7]['attributes'][46]['values'];
#        ^
#        +-- note the ampersand

这使得$values成为$output[7]['attributes'][46]['values']别名,因此您对其中的任何更改也会显示在另一个中。

(但是,请注意,参考文献往往会产生神奇的行为 - 而在计算机程序中,魔术通常是一件坏事。不要因为你可以使用引用而不必使用引用;它们应该只是在他们比替代方案更清楚的地方使用。)

至于手头的问题,一旦你有$values,它就会更容易加入然后爆炸。

$joined = implode(',', $values);
$unique = array_unique(explode(',', $joined));

答案 2 :(得分:0)

$values = array();

for ($i = 0; $i < count($output[7]['attributes'][46]['values']); $i++) {
    $exploded = explode(',', $output[7]['attributes'][46]['values'][$i]);

    for ($j = 0; $j < count($exploded); $j++) {
        array_push($values, $exploded[$j]);
    }
}

echo array_unique($values);

这可能是最直接的方法,您可以根据您在数据中找到的内容添加额外的比较和验证。