微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在PHP中将多维数组过滤到另一个?

可能这个问题是重复的,因为我不知道如何描述问题来找到答案.

我有一个包含3个参数的数组:日期,事件和标签.

>日期包含unix时间戳,
>事件是包含事件ID的arrya,
> Tags是一个包含事件标签的数组(如果数字不是单独的,则以逗号分隔的字符串).

这是数组:

    Array
    (
        [date] => 1554328800
        [events] => Array
            (
                [0] => 130
                [1] => 131
                [2] => 163
            )

        [tags] => Array
            (
                [0] => 4
                [1] => "1,3,4"
                [2] => "1,3"
            )

    )

事件和标签间的关系在键中,因此具有位置0的事件130具有标签4.

如您所见,有一些标签重复(事件130和131或131和163).

我怎么能得到一个只有这样重复事件的数组:

    Array
    (
      [0] => Array
      (
        [date] => 1554328800
        [events] => Array
            (
                [0] => 130
                [1] => 131
            )

        [tags] => 4
      )
      [1] => Array
      (
        [date] => 1554328800
        [events] => Array
            (
                [0] => 131
                [1] => 163
            )

        [tags] => Array
           (
               [0] => 1
               [1] => 3
           )
      )
    )

解决方法:

我将如何做到这一点:

>列出每个标签的事件

这将提供几组事件,可以在下一步中使用
>列出上一步中发生的每组事件的标签
>从第2步生成结果

这是代码,也可以在3v4l.org运行:

// Sample input
$data = [
    "date" => 1554328800,
    "events" => [130, 131, 163],
    "tags" => [4, "1,3,4", "1,3"]
];

// 1. List the events per individual tag
foreach($data["tags"] as $i => $val) {
    $vals = explode(",", $val);
    foreach($vals as $val) {
        $eventsByTag[$val][] = $data["events"][$i];
    }
}

// 2. List the tags per set of events
foreach($eventsByTag as $tag => $events) {
    sort($events, SORT_NUMERIC);
    $tagsByEvents[implode(",", $events)][] = $tag;
}

// 3. produce the result
foreach($tagsByEvents as $events => $tags) {
    $events = explode(",", $events);
    if (count($tags) == 1) $tags = $tags[0];
    $result[] = [
        "date" => $data["date"],
        "events" => $events,
        "tags" => $tags
    ];
}

print_r($result);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐