Php 循环将单个元素添加到数组中两次 编辑

Php 循环将单个元素添加到数组中两次 编辑,php,arrays,loops,Php,Arrays,Loops,即使我没有使用嵌套循环,它也会产生重复的循环。我最终通过将updates数组键设置为update键进行了一次肮脏的修复,这样至少会覆盖一个副本。。。我发誓那不是数据。更新ID是我的主键,所以数据库中不可能有重复项,而且我现在正在查看我的数据库,没有重复项 无论如何,这不是一个很好的解决方案,但我想这解决了它: foreach( $L_a_updates as $update ){ if( array_key_exists($update['eventId'], $L_a_e

即使我没有使用嵌套循环,它也会产生重复的循环。我最终通过将updates数组键设置为update键进行了一次肮脏的修复,这样至少会覆盖一个副本。。。我发誓那不是数据。更新ID是我的主键,所以数据库中不可能有重复项,而且我现在正在查看我的数据库,没有重复项

无论如何,这不是一个很好的解决方案,但我想这解决了它:

   foreach( $L_a_updates as $update ){
        if( array_key_exists($update['eventId'], $L_a_events) ){
             $L_a_events[ $update['eventId'] ]['updates'][ $update['updateId'] ] = $update;
        }
    }
下面的答案是好的,显然是比我现在更有能力的人给出的。TGIF

下面是原始问题
这是一个周五的下午,所以这可能是非常愚蠢的事情,但我不能让它正常工作

我有两个数组,
$L_a_事件
$L_a_更新
。每个事件都可以有0个或多个更新。我从数据库中获取事件,然后获取更新,然后通过循环运行它们以比较事件ID并将更新添加到它们的事件中。最后的结构是这样的:

 Array(
      [0] => Array(
          ['eventId'] => 2,
          ['message'] => 'Some message',
          ['updates'] => Array(
              [0] => Array (
                  ['updateId'] => 123,
                  ['eventId']  => 2,
                  ['message']  => 'Some update message',
              )
          )
      )
 );
我运行此循环以实现以下目标:

foreach( $L_a_events as $key => $event ){
    foreach( $L_a_updates as $update ){
        if($update['eventId'] == $event['eventId']){
            $L_a_events[$key]['updates'][] = $update;
        }
    }
}
我的循环有问题吗?!数据库中的结果集不显示重复项。当我在运行循环之前打印两个数组时,它们看起来都很好

只有在这个循环之后,出于某种原因,单个更新才会被添加到事件数组中两次。而且,并不是每一次更新都能做到这一点

因此,在循环之后,我得到以下结果,而不是上面的数组:

 Array(
      [0] => Array(
          ['eventId'] => 2,
          ['message'] => 'Some message',
          ['updates'] => Array(
              [0] => Array (
                  ['updateId'] => 123,
                  ['eventId']  => 2,
                  ['message']  => 'Some update message',
              ),
              [1] => Array (
                  ['updateId'] => 123,
                  ['eventId']  => 2,
                  ['message']  => 'Some update message',
              )
          )
      )
 );

这样做不需要两个嵌套的foreach循环。您需要做的是:

for each update:
    if event with this update's event id exists:
        add update to the event's array entry
绝对没有必要对所有事件进行循环。您已经有一个包含所有这些事件的数组您需要做的就是确保事件数组使用事件的ID作为键。

在PHP中,这看起来像这样:

foreach ($L_a_updates as $update) {
    $key = $update['event_id'];
    if (array_key_exists($key, $L_a_events)) {
        $L_a_events[$key]['updates'][] = $update;
    }
}

对我来说,这似乎是非常低效的代码,尽管我看不出问题出在哪里。如果$L_a_事件的键是eventId,那么您可以从需要添加的更新开始:

foreach ($L_a_updates as $update) {
  $eventId = $update['eventId'];
  $L_a_events[$eventId]['updates'][] = $update;
}
这样会更简单更快。假设某个事件存在,前提是您对其进行了更新。您甚至可以编写一些代码来实现:

foreach ($L_a_events => $event) 
{
  $eventId = $event['eventId'];
  $newEvents[$eventId] = $event;
}

并使用$newEvents而不是$L_a_events。现在你不再有嵌套循环了。

你的代码可以正常工作了。根据前面的答案,这不是最优的。检查您的数据

<?php

$L_a_events = array(0=>array('eventId'=>1),1=>array('eventId'=>2));
$L_a_updates = array(0=>array('updateId'=>1,'eventId'=>1),1=>array('updateId'=>2,'eventId'=>1),2=>array('updateId'=>3,'eventId'=>2));

foreach( $L_a_events as $key => $event ){
    foreach( $L_a_updates as $update ){
        if($update['eventId'] == $event['eventId']){
            $L_a_events[$key]['updates'][] = $update;
        }
    }
}
print_r($L_a_events);

?>

结果是什么?你能发布它吗?你能发布两个数组的结构吗?这里没有什么突出的地方,你能给我们展示一个例子吗?也许是在PHP中?为什么不合并SQL语句并将这两个表连接在一起?遍历结果很可能比手动合并更容易。我将在一段时间内做一个小动作,需要一段时间,因为出于某种原因,我只能在生产环境中重现此问题。啊,您也有相同的想法。:-)你知道我一直认为嵌套循环是问题所在。但当我用你的例子时,有些事情出了问题。我想这里真正的问题可能是今天是星期五。。。就像我说过很多次的。我确实检查了数据。我检查了数据库。我检查了来自数据库的结果集。没有重复的。我不是有意忽视你的评论。我发布的代码证明了你的逻辑是正确的。因此,我只能认为问题在于你的输入数组。是的,我也不明白为什么它不能工作。我是说这很难看,但是。。。我觉得这是一个我应该明天再看的案例,也许马上就能看到问题所在。至少现在有一个肮脏的解决方案。
Array
(
    [0] => Array
        (
            [eventId] => 1
            [updates] => Array
                (
                    [0] => Array
                        (
                            [updateId] => 1
                            [eventId] => 1
                        )

                    [1] => Array
                        (
                            [updateId] => 2
                            [eventId] => 1
                        )

                )

        )

    [1] => Array
        (
            [eventId] => 2
            [updates] => Array
                (
                    [0] => Array
                        (
                            [updateId] => 3
                            [eventId] => 2
                        )

                )

        )

)