2014-04-12 29 views
0

当数组键是数字时,我怎样才能调用特定的数组。我的阵列看起来像这样:当数组键是数字时,我怎样才能调用特定的数组

我阵列等于$输出:

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]

任何帮助,将不胜感激。

回答

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

该功能进入递归通过阵列并且如果阵列被发现他们正在被迭代和每一个标量要素是使用逗号作为分隔符分解搜索等于“值”,密钥。最后,所有的字符串都会被修剪,并返回唯一的元素列表。

用法:

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

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

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

这可能是最简单的方式来完成这件事,你可以添加基于您在数据查找额外的比较和验证。

+0

数组在PHP中没有'.length'。改用'count(你的数组)'。或者甚至更好,'foreach((你的数组))作为$ i => $ str)'。 – cHao

+0

Opps,让我的电线在PHP和JS之间交叉了一秒。赶上@cHao,谢谢! – gfish3000

相关问题