Замена вложенного foreach l oop на что-то более эффективное в PHP - PullRequest
0 голосов
/ 08 мая 2020

У меня есть два массива, каждый с разной структурой:

$websites = Array (
     [1131] => Array (
          [httpcode] => 403
          [user_id] => 265
     )

     [1130] => Array (
          [httpcode] => 403
          [user_id] => 265
     )
)

$responses = Array (
     [1131] => 200
     [1130] => 500
)

Я использую вложенный foreach l oop для замены httpcode в массиве $websites соответствующим новым httpcode в массиве $responses:

foreach ($websites as $site_id => &$details) {
    foreach ($responses as $resp_id => $new_http)  {
        if ($site_id == $resp_id) {
            $details['httpcode'] = $new_http;
        }  
    }        
}

Это работает успешно, и я получаю правильный результат:

$websites = Array (
     [1131] => Array (
          [httpcode] => 200
          [user_id] => 265
     )

     [1130] => Array (
           [httpcode] => 500
           [user_id] => 265
     )
)

Однако я понимаю, что вложенные циклы foreach имеют высокую стоимость в Циклы ЦП, и я хотел бы знать, есть ли более эффективный способ сделать это для больших массивов в отношении минимизации использования ЦП на сервере.

Ответы [ 2 ]

1 голос
/ 09 мая 2020

Второй л oop совершенно бессмысленно. Этого будет достаточно:

foreach ($websites as $site_id => &$details) {
    $details['httpcode'] = $responses[$site_id];
}

В случае, если оба массива не могут быть синхронизированы c, вам нужно будет добавить дополнительную проверку ключа:

foreach ($websites as $site_id => &$details) {
    if (array_key_exists($site_id, $responses)) {
        $details['httpcode'] = $responses[$site_id];
    }
}
0 голосов
/ 09 мая 2020

Если ключи массива идентичны:

foreach(array_keys($websites) as $key) {
  $websites[$key]['httpcode'] = $responses[$key];
}
...