当数组键是数字时,我如何调用特定的数组。我的数组如下所示:
我的数组等于 $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
)
)
等等...我有很多...
我需要做的是获取 [值] 的所有键,并在有逗号的地方分解这些键的值。然后让它们都独一无二。我不知道如何调用这些数组而不必继续输入这样的数字:$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 = 数组((;并将$callback替换为实际函数,这样您就不会使用闭包。
$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);
这可能是完成此操作的最直接方法,您可以根据在数据中找到的内容添加额外的比较和验证。
如果你在这样的树深处有一个特定的数组,并且你只想读取值,只需将子数组分配给一个变量。
$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));