在多维数组中搜索结果并添加到变量中

时间:2016-05-26 20:08:07

标签: php arrays multidimensional-array

我无法通过多维数组进行排序,而这些数组是从每次都不同的XML Feed中提取的。我需要找到一些东西并将结果放在一个变量中。我还在学习PHP,不幸的是这有点过头了。

我打破了我所拥有的一切。 $valsarray中包含的数组示例:

Array
( [0] => Array
        (
            [tag] => GIVENNAME
            [type] => complete
            [level] => 8
            [value] => peter
        )
  [1] => Array
        (
            [tag] => FAMILYNAME
            [type] => complete
            [level] => 8
            [value] => rabbit
        )
 [2] => Array
        (
            [tag] => COMPLETENUMBER
            [type] => complete
            [level] => 9
            [value] => 123-345-4567
        )
 [3] => Array
        (
            [tag] => URIID
            [type] => complete
            [level] => 9
            [value] => customerEmail@gmail.com
        )
)

现在我明白我可以使用:$phone = $valsarray[2][value];

获得结果

但是,我的问题是,如果没有给出电话号码,XML Feed将不包含电话号码阵列,因此阵列3将成为阵列2.

所以我的问题是如何循环遍历数组以查找COMPLETENUMBER是否存在,然后将value中包含的电话号码分配给$phone变量?

3 个答案:

答案 0 :(得分:2)

以这种方式:

$tags = array_column($valsarray, null, 'tag');

if(isset($tags['COMPLETENUMBER'])) {
    $phone = $tags['COMPLETENUMBER']['value'];
}

或者,如果您只关心value

$tags = array_column($valsarray, 'value', 'tag');

if(isset($tags['COMPLETENUMBER'])) {
    $phone = $tags['COMPLETENUMBER'];
}

简而言之:

  • 获取value
  • 索引的tag值数组
  • 如果设置了COMPLETENUMBER索引,则从value
  • 获取值

array_column()之后,您可以获得所需的value

$email = $tags['URIID'];

答案 1 :(得分:1)

这个循环会这样做:

foreach($valsarray as $fieldArray)
{
    if ($fieldArray['tag'] === 'COMPLETENUMBER')
    {
        $phone = $fieldArray['value'];
        break;
    }
}

如果你需要在同一个阵列上反复进行这种类型的事情,你最好重新编制索引而不是每次搜索。你可以像这样重新索引:

foreach($valsarray as $key => $fieldArray)
{
    $valsarray[$fieldArray['tag']] = $fieldArray;
    unset($valsarray[$key]);
}

重新编制索引后,您可以对所需的任何字段执行此操作:

$phone = $valsarray['COMPLETENUMBER']['value'];

答案 2 :(得分:1)

您可以' '仅获取array_filter条目,并设置COMPLETENUMBER(如果找到)。

$phone

根据您的其他评论,如果您想从数组中获取标记子集的值,可以在$items = array_filter($valsarray, function($x) { return $x['tag'] == 'COMPLETENUMBER'; }); $phone = $items ? reset($items)['value'] : null; 回调中使用in_array。这可以包含在AbraCadaver答案中建议的array_filter中,以获取您感兴趣的任何标记的值数组:

array_column

结果如下:

$tags = ['COMPLETENUMBER', 'URIID'];
$data = array_column(array_filter($valsarray, function($x) use ($tags) {
    return in_array($x['tag'], $tags);
}), 'value', 'tag');