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

4

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

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

  • 日期包含Unix时间戳,
  • 事件是一个包含事件ID的数组,
  • 标签是一个包含事件标签的数组(如果数字不是单独的,则为逗号分隔的字符串)。

这是数组:

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

tag是一个值数组还是逗号分隔的字符串? - cegfault
在你的问题中,你将tag[0]标记为4,它是一个数字还是像"4"这样的字符串? - Nirav Madariya
当数字单独出现时,它是 int 类型,否则是包含逗号分隔数字的字符串。 - Sergio Marani
3个回答

2
这是我会做的方法:
  1. 按照每个标签列出事件

    这将给出几组事件,可以在下一步中使用

  2. 按照发生在上一步中的每组事件列出标签

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

0
$date = array();
$date['date'] = 1554328800;
$date['events'] = array(130, 131, 163);
$date['tags'] = array(4, "1,3,4", "1,3");

$events_by_tag = array(); //gather events grouped by tag
foreach ($date['events'] as $pos => $event) { //parse all events

    if (is_string($date['tags'][$pos])) { //if tag is a string <=> if there are more than one tag for the current event

        $tags = explode(',', $date['tags'][$pos]); //explode string to loop over the tags
        foreach ($tags as $tag) {
            if (is_array($events_by_tag[$tag])) { //if tag has already been found and then an array exists to store it
                array_push($events_by_tag[$tag], $event);
            } else {
                $events_by_tag[$tag] = array($event); //else create an array for the next times this tag will be found and store it inside
            }
        }

    } else { //if there's a single tag which is a integer

        if (is_array($events_by_tag[$tag])) { //if tag has already been found and then an array exists to store it
            array_push($events_by_tag[$date['tags'][$pos]], $event);
        } else {
            $events_by_tag[$date['tags'][$pos]] = array($event); //else create an array for the next times this tag will be found and store it inside
        }

    }

}

$result_array = array(); //final array reorganized + date
foreach ($events_by_tag as $tag => $events) {
    $tmp_array['date'] = $date['date'];
    $tmp_array['events'] = $events;
    $tmp_array['tags'] = $tag;
    array_push($result_array, $tmp_array);
}

这并不完全符合你的预期,因为它不会合并共享标签的事件。我认为这部分需要另一篇文章来进行开发,但如果必要的话,我可以修改我的答案,给你前进的方向。


0
请检查这个

标签


$sarr=['date'=>1554328800,
    'events'=>
    [
                130,
                131,
                163
    ],
    'tags'=>
    [
        4,
        "1,3,4",
        "1,3"  
    ]

    ]; 
$tagarr=[];
$events=$sarr['events'];
$index=0;
foreach( $sarr['tags'] as $tag)  
{ 
 $t=explode(",",$tag);
 $cnt=count($t);
 for($idx=0;$idx<$cnt;$idx++)
  $tagarr[$t[$idx]][]=$events[$index];
 $index++;
}
$cnt=count($tagarr);
$myarr=[];
foreach($tagarr as $key=>$value)
 {
  $myarr[]=['date'=>$sarr['date'],'events'=>$value,'tags'=>$key];
  }
ec ho "<pre>";
print_r($myarr);
echo "</pre>";

输出结果为

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

         [tags] => 4
    )

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

        [tags] => 1
    )

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

        [tags] => 3
    )

  )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接