Я надеюсь, что у меня есть исходный массив данных в правильной компоновке, поскольку формат немного сбивал с толку от первоначального вопроса.Но основная идея состоит в том, чтобы использовать array_column для извлечения «attrs» и ввода результата с помощью элемента «name» этого массива.
$response = Array(
"results" => Array(
0 => Array(
"attrs" => Array(
"__name" => "HOSTNAME0",
"acknowledgement" => 0,
"acknowledgement_expiry" => 0,
"state" => 0,
"state_type" => 1
),
"name" => "HOSTNAME0",
"type" => "Host"
),
1 => Array(
"attrs" => Array(
"__name" => "HOSTNAME1",
"acknowledgement" => 0,
"acknowledgement_expiry" => 0,
"state" => 2,
"state_type" => 1
),
"name" => "HOSTNAME1",
"type" => "Host1"
)
)
);
$extract = array_column($response["results"], "attrs", "name");
print_r($extract);
Для данных примера это дает ...
Array
(
[HOSTNAME0] => Array
(
[__name] => HOSTNAME0
[acknowledgement] => 0
[acknowledgement_expiry] => 0
[state] => 0
[state_type] => 1
)
[HOSTNAME1] => Array
(
[__name] => HOSTNAME1
[acknowledgement] => 0
[acknowledgement_expiry] => 0
[state] => 2
[state_type] => 1
)
)
Таким образом, чтобы найти любой сервер по имени, вы должны использовать
echo "HOSTNAME1=".$extract["HOSTNAME1"]["state"].PHP_EOL;
Если вы хотите только поле состояния (как вы и просили) и хотите упростить массив, вы можете затемuse ...
array_walk($extract, function(&$data) {$data=$data["state"];});
print_r($extract);
array_walk()
проходит через массив и просто копирует поле состояния, чтобы быть записью, поэтому в результате получается ...
Array
(
[HOSTNAME0] => 0
[HOSTNAME1] => 2
)
Так что теперь вы просто делаете ...
echo "HOSTNAME1=".$extract["HOSTNAME1"].PHP_EOL;