Loop将单个元素添加到数组两次

时间:2015-02-27 13:19:41

标签: php arrays loops

修改


即使我没有使用嵌套循环,它也会产生重复。我最后通过将更新数组键设置为更新密钥来进行脏修复,因此至少会重写一个副本...我发誓这不是数据。更新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_events$L_a_updates。每个事件都可以有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',
              )
          )
      )
 );

3 个答案:

答案 0 :(得分:1)

您不需要两个嵌套的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;
    }
}

答案 1 :(得分:1)

对我来说代码似乎效率很低,虽然我看不出它有什么问题。如果$ L_a_events的键是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。现在你不再有嵌套循环了。

答案 2 :(得分:0)

您的代码正常运行。根据之前的答案,它无论如何都不是最佳的。检查您的数据。

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

?>

输出:

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
                        )

                )

        )

)