Foreach - как изменить данные внутри массива

Европа - быстрые серверы на дисках NVMe от $5 / Русский датацентр от 199руб

Тема в разделе "Вопросы по программированию на РНР", создана пользователем Fath1, 4 дек 2018.

  1. Fath1

    Fath1 Новичок

    Сообщения:
    6
    Ваш город:
    Москва
    Address:
    Moscow, Russia
    Country:
    Location on Map:
    Есть следующий цикл

    PHP:
    foreach ($servers as $server){
      if (
    $server["Status"]==="Configured"){
             
    $server["Status"]="Working"
      }
    }
    var_dump($servers);
    Код:
    array(1) {
      [12345678]=>
      array(4) {
        ["ID"]=>
        string(8) "12345678"
        ["IP"]=>
        string(9) "192.0.0.1"
        ["Pass"]=>
        string(8) "password"
        ["Status"]=>
        string(10) "Configured"
      }
    }
    
    Подскажите пожалуйста как мне обратиться к массиву $servers и изменить параметр "Status" ?
    Пробовал $servers[$server["Status"]]="Working";
    что-то не получается...
     
  2. WMix

    WMix герр M:)ller Партнер клуба

    Сообщения:
    6.311
    Ваш город:
    Berlin
    Address:
    Berlin, Germany
    Country:
    Location on Map:
    PHP:
    foreach ($servers as $key => $server)
        
    $servers[$key]["Status"] = null;
     
    Fath1 и AmdY нравится это.
  3. Adelf

    Adelf Laravel&PhpStorm Команда форума

    Сообщения:
    3.337
    Ваш город:
    Казань
    Address:
    Kazan, Russia
    Country:
    Location on Map:
    Вполне достаточно:
    PHP:
    foreach ($servers as &$server){
     
    c0dex нравится это.
  4. WMix

    WMix герр M:)ller Партнер клуба

    Сообщения:
    6.311
    Ваш город:
    Berlin
    Address:
    Berlin, Germany
    Country:
    Location on Map:
    такое легкое возвращение в мир "C", да имеет право, но я избегаю "&" пока в этом нет необходимости
     
  5. Adelf

    Adelf Laravel&PhpStorm Команда форума

    Сообщения:
    3.337
    Ваш город:
    Казань
    Address:
    Kazan, Russia
    Country:
    Location on Map:
  6. WMix

    WMix герр M:)ller Партнер клуба

    Сообщения:
    6.311
    Ваш город:
    Berlin
    Address:
    Berlin, Germany
    Country:
    Location on Map:
    я даже не знаю как это с array_map решить
     
  7. AmdY

    AmdY Пью пиво Команда форума

    Сообщения:
    6.994
    Ваш город:
    Belarus, Minsk
    Address:
    Minsk, Belarus
    Country:
    Location on Map:
    PHP:
    $servers array_map(function($server) {
        if (
    $server["Status"] === "Configured") {
             
    $server["Status"] = "Working";
        }
        return 
    $server;
    }, 
    $servers);
    Хотя мне вариант @WMix нравится больше. Мэпы это больше для любителей функциональщины и обычно при этом лучше создавать новый массив, нежели мутировать существующий. А ссылки в foreach чреваты проблемами. Недавно тема была про preg_match с одинаковой переменной
     
    флоппик и WMix нравится это.
  8. WMix

    WMix герр M:)ller Партнер клуба

    Сообщения:
    6.311
    Ваш город:
    Berlin
    Address:
    Berlin, Germany
    Country:
    Location on Map:
    наоборот - oop :)
    PHP:
    $servers = new ServerCollection(array_map(function($server){
      return new 
    Server($server["ID"], $server["Status"], ...);
    }, 
    $sql_result));
     
  9. fixxxer

    fixxxer К.О. Партнер клуба

    Сообщения:
    12.947
    Ваш город:
    Moscow, Russia
    Address:
    Moscow, Russia
    Country:
    Location on Map:
    ООП было бы как-то так:

    PHP:
    $servers = new Collection<Server>;
    ...
    $servers $servers->map(function(Server $server):Server { ... })
    Правда, с точки зрения ООП подобная операция вообще очень сомнительна. Не должно быть подобного кода в ООП.
     
  10. WMix

    WMix герр M:)ller Партнер клуба

    Сообщения:
    6.311
    Ваш город:
    Berlin
    Address:
    Berlin, Germany
    Country:
    Location on Map:
    но как-то нужно из базы (в его случае json) на обьекты выйти
     
  11. Adelf

    Adelf Laravel&PhpStorm Команда форума

    Сообщения:
    3.337
    Ваш город:
    Казань
    Address:
    Kazan, Russia
    Country:
    Location on Map:
    Проблема возникла из-за того, что человек работает с массивами, когда надо бы с объектами.
    PHP:
    foreach ($servers as $server) {
      
    $server->changeStatus();
    }
     
  12. WMix

    WMix герр M:)ller Партнер клуба

    Сообщения:
    6.311
    Ваш город:
    Berlin
    Address:
    Berlin, Germany
    Country:
    Location on Map:
    не наоборот, он начал работать с обьектами пока не уткнулся в проблему
    PHP:
    $obj json_decode('{"42":"foo"}');
    $obj->42 'bar';// оппа
    там по хорошему было бы json поменять
     
  13. Adelf

    Adelf Laravel&PhpStorm Команда форума

    Сообщения:
    3.337
    Ваш город:
    Казань
    Address:
    Kazan, Russia
    Country:
    Location on Map:
    Stdclass это не объекты
     
  14. WMix

    WMix герр M:)ller Партнер клуба

    Сообщения:
    6.311
    Ваш город:
    Berlin
    Address:
    Berlin, Germany
    Country:
    Location on Map:
    ну возможно в определенном контексте :stdClass не является объектом, но с точки зрения пхп
    PHP:
    var_dump(is_object(new \stdClass));
     
  15. fixxxer

    fixxxer К.О. Партнер клуба

    Сообщения:
    12.947
    Ваш город:
    Moscow, Russia
    Address:
    Moscow, Russia
    Country:
    Location on Map:
    вопрос, зачем вообще менять Configured на Working. почему сразу Working не поставить?
     
  16. Fath1

    Fath1 Новичок

    Сообщения:
    6
    Ваш город:
    Москва
    Address:
    Moscow, Russia
    Country:
    Location on Map:
    Это один из IF-ов и кусок кода. Разбиваю работу скрипта на части чтобы было понятнее и удобнее диагностировать ошибки.

    PHP:
    foreach ($servers as $key => $server){
      if (
    $server["Status"]==="Configured"){
         
    $server["Status"]="Working";
         
    $servers[$key]["Status"] = "Working";
      }

      if ((
    $server["Status"]==="Working")){
        
    //do something
      
    }
    }
    var_dump($servers)
    Если не использовать
    PHP:
    $server["Status"]="Working";
    Тогда следующий IF внутри цикла не видит изменений текущего $server["Status"]

    Если не использовать
    PHP:
     $servers[$key]["Status"] = "Working"
    тогда var_dump($servers) по завершение выхода из цикла не показывает никаких изменений в массиве
     
    Последнее редактирование: 6 дек 2018
  17. Фанат

    Фанат oncle terrible Команда форума

    Сообщения:
    39.956
    Ваш город:
    Moscow, Russia
    Address:
    Moscow, Russia
    Country:
    Location on Map:
    По-моему, это ты написал ерунду. Вариант с явным циклом - наиболее читабельный.
     
  18. Фанат

    Фанат oncle terrible Команда форума

    Сообщения:
    39.956
    Ваш город:
    Moscow, Russia
    Address:
    Moscow, Russia
    Country:
    Location on Map:
    Работай в цикле как работал, с $server
    А последней строчкой в цикле добавь $servers[$key] = $server
     
  19. Adelf

    Adelf Laravel&PhpStorm Команда форума

    Сообщения:
    3.337
    Ваш город:
    Казань
    Address:
    Kazan, Russia
    Country:
    Location on Map:
    Да. map надо юзать для других целей, не для модификации текущего стейта.
    Но самый читабельный и правильный вариант я уже указывал - нормальные объекты.