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

Php 当数组键是数字时,如何调用特定数组,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,当数组键是数字时,如何调用特定数组。我的数组如下所示: 我的数组等于$output: Array ( [7] = Array ( [name] = Grill Specifications [attributes] = Array ( [46] = 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]

任何帮助都将不胜感激

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=[]开始;$values=array;用实际函数替换$callback,这样就不用闭包了。

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

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

现在,您可以只查看$value,而不是每次都在树中探索,因为每个$value实际上都是另一个的副本

assert('$values[0] === $output[7]["attributes"][46]["values"][0]');
如果需要更改数组,可以使用引用来代替

$values =& $output[7]['attributes'][46]['values'];
#        ^
#        +-- note the ampersand
这使得$values成为$output[7]['attributes'][46]['values']的别名,因此对其中一个的任何更改都将出现在另一个中

assert('$values[0] === $output[7]["attributes"][46]["values"][0]');
不过,请注意,引用往往会导致具有魔力的行为——在计算机程序中,魔力往往是一件坏事。不要仅仅因为你可以,就随意使用参考资料;它们只能在比备选方案更清晰的地方使用

至于手头的问题,一旦你有了$value,加入然后分解就更简单了

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

这可能是完成此任务最简单的方法,您可以根据在数据中找到的内容添加额外的比较和验证。

数组在PHP中没有.length。改为使用数组。或者更好的方法是,将数组命名为$i=>$str.Opps,让我在PHP和JS之间的连线交叉了一会儿。抓得好@cHao,谢谢!