【问题标题】:Compare multidimensional array with another array in PHP and get the values from the multidimensional array将多维数组与 PHP 中的另一个数组进行比较,并从多维数组中获取值
【发布时间】:2018-06-12 16:46:11
【问题描述】:

我有一个来自 XML 文件的多维数组,我想将它与普通数组进行比较。我需要将多维数组中的 [tag] 名称与另一个数组中的名称进行比较,并从属于该标签的多维数组中获取值。

Array
(
    [0] => Array
        (
            [tag] => DOCUMENT
            [type] => open
            [level] => 1
        )

    [1] => Array
        (
            [tag] => SENDERID
            [type] => complete
            [level] => 2
            [value] => TEST
        )

    [2] => Array
        (
            [tag] => SENDERSHORTNAME
            [type] => complete
            [level] => 2
        )

    [3] => Array
        (
            [tag] => RECIPIENTID
            [type] => complete
            [level] => 2
            [value] => VGLEE
        )
)

我需要将它与多维数组进行比较的第二个数组:

$compare_array = array('DOCUMENT', 'SENDERID', 'SENDERSHORTNAME', 'RECIPIENTID');

现在我想检查 $compare_array 中的键是否在多维数组中匹配。如果是这样,我想从多维数组中获取值并使用 compare_array 中的名称创建一个变量并将值附加到变量中。

我做了一个for循环:

for($i = 0; $i < $count; $i++){
    if($values[$i]['tag'] == 'SENDERID'){
        $SENDER = $values[$i]['value'];
    }
    if($values[$i]['tag'] == 'RECIPIENTID'){
        $RECIPIENTID = $values[$i]['value'];
    }
    if($values[$i]['tag'] == 'IREF'){
        $IREF = $values[$i]['value'];
    }
    if($values[$i]['tag'] == 'DOCUMENTNUMBER'){
        $DOCUMENTNUMBER = $values[$i]['value'];
    }
}

【问题讨论】:

  • 你的试验在哪里?您可以从使用 foreach 和 if 开始
  • @Ghost 查看更新后的问题。这是我第一次做的,但我认为一定有更简单的方法。
  • 我不知道你为什么需要这样的东西,但是,你可能会为所有意图和目的使用可变变量,但我建议只按标签对它们进行分组,将它们保存为数组但使用标签作为键
  • @Ghost 从 XML 文件中我得到了 61 个键,我需要部分键+值。这就是为什么我想列出一个清单并进行比较。如果列表发生变化,我可以动态进行更改。
  • 它仍然可以正常工作,如果它们被分组在一个数组中,您可以在它们具有相同标签时推送它们,here's what i'm suggesting

标签: php arrays


【解决方案1】:

对于您的示例数据,您可以使用array_reduce 并使用in_array 检查tag 是否存在于$compare_array

如果您必须使用来自 $compare_array 的名称创建一个变量并将值附加到该变量,您可以使用带有符合您期望的标志的 extract

value 并未出现在所有示例数据中,因此您也可以检查它是否存在。

$compare_array = array('DOCUMENT', 'SENDERID', 'SENDERSHORTNAME', 'RECIPIENTID');
$result = array_reduce($arrays, function($carry, $item) use ($compare_array) {
    if(isset($item["value"]) && in_array($item["tag"], $compare_array, true)) {
        $carry[$item["tag"]] = $item["value"];
    }
    return $carry;
});
extract($result, EXTR_OVERWRITE);

echo $SENDERID;
echo $RECIPIENTID;

Demo

【讨论】:

  • 感谢您的回答。这就是我要找的。我必须更深入地了解文档才能更好地理解它,但是您在这方面帮助了我很多。我要感谢所有其他人的帮助。
  • 我还有一个问题。我的数组有索引,但在您的示例中,该数组没有索引。如何制作相同的数组?我必须取消设置吗?
  • 如果您的意思是原始数组中的 0、1、2 和 3,它们仍然存在。 0 是第一项,然后是 1 等等。Demo 你可以阅读arrays 和索引。
【解决方案2】:

在这种情况下你可以尝试使用array_in(),下面是示例代码

for($i = 0; $i < $count; $i++){
    if(in_array($values[$i]['tag'],$compare_array)){
        $value = $values[$i]['value'];
    }

}

供参考in_array()

【讨论】:

    【解决方案3】:

    试试下面的代码:

    $array = []; //Complete array to be parsed.
    $compare_array = array('DOCUMENT', 'SENDERID', 'SENDERSHORTNAME', 'RECIPIENTID');
    
    
    foreach ($array as $value) {
        if (in_array($value["tag"], $compare_array)) {
            $$value["tag"] = $value["value"];
        }
    }
    

    它将遍历数组,如果tag名称匹配到值$compare_array,则定义一个带有标签名称的变量并用值初始化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-29
      • 1970-01-01
      • 1970-01-01
      • 2017-10-22
      • 2013-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多