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

Fath1

Новичок
Есть следующий цикл

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";
что-то не получается...
 

Adelf

Administrator
Команда форума
Вполне достаточно:
PHP:
foreach ($servers as &$server){
 

WMix

герр M:)ller
Партнер клуба
такое легкое возвращение в мир "C", да имеет право, но я избегаю "&" пока в этом нет необходимости
 

WMix

герр M:)ller
Партнер клуба
я даже не знаю как это с array_map решить
 

AmdY

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

fixxxer

К.О.
Партнер клуба
ООП было бы как-то так:

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

Adelf

Administrator
Команда форума
Проблема возникла из-за того, что человек работает с массивами, когда надо бы с объектами.
PHP:
foreach ($servers as $server) {
  $server->changeStatus();
}
 

WMix

герр M:)ller
Партнер клуба
не наоборот, он начал работать с обьектами пока не уткнулся в проблему
PHP:
$obj = json_decode('{"42":"foo"}');
$obj->42 = 'bar';// оппа
там по хорошему было бы json поменять
 

fixxxer

К.О.
Партнер клуба
вопрос, зачем вообще менять Configured на Working. почему сразу Working не поставить?
 

Fath1

Новичок
Это один из 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) по завершение выхода из цикла не показывает никаких изменений в массиве
 
Последнее редактирование:

Adelf

Administrator
Команда форума
По-моему, это ты написал ерунду. Вариант с явным циклом - наиболее читабельный.
Да. map надо юзать для других целей, не для модификации текущего стейта.
Но самый читабельный и правильный вариант я уже указывал - нормальные объекты.
 
Сверху