У меня есть два массива, второй многомерный. Я пытаюсь вернуть третий массив, в котором service_id в Array2 соответствует значениям в Array1.
Array1
(
[0] => 158
[1] => 162
)
Array2
(
[localhost] => Array
(
[0] => Array
(
[host_name] => localhost
[current_state] => 0
[service_id] => 158
)
[1] => Array
(
[host_name] => localhost
[current_state] => 0
[service_id] => 159
)
)
[192.168.0.43] => Array
(
[0] => Array
(
[host_name] => 192.168.0.43
[current_state] => 0
[service_id] => 168
)
[1] => Array
(
[host_name] => 192.168.0.43
[current_state] => 1
[service_id] => 162
)
)
)
Итак, Array3 должен быть:
Array3
(
[localhost] => Array
(
[0] => Array
(
[host_name] => localhost
[current_state] => 0
[service_id] => 158
)
[192.168.0.43] => Array
(
[0] => Array
(
[host_name] => 192.168.0.43
[current_state] => 0
[service_id] => 162
)
)
)
Вот что у меня есть, но, похоже, он не фильтрует весь массив.
$Array3= array_filter($Array2, function ($value) use ($Array1) {
return in_array(array_shift($value)['service_id'], $Array1);
});
Я здесь близко, что мне не хватает?






Итак, ниже должно быть то, что вам нужно для достижения $ Array3:
$Array3 = array(array($Array2[0][0], $Array2[0][1], $Array1[0]), array($Array2[1][0],
$Array2[1][1], $Array1[1]));
Однако, чтобы достичь этого более динамично, вам нужно использовать что-то вроде:
$Array3 = array();
for($i = 0; $i < $Array2[0].length; $i++){
array_push($Array3, array($Array2[$i][0], $Array2[$i][1], $Array1[$i]));
}
var_dump($Array3) // For debug only.
Я думаю, что из-за того, что вы хотите фильтровать на второй глубине, он должен пройти через первый уровень, а затем отфильтровать второй уровень (думаю, что это имеет смысл).
Таким образом, этот код использует array_map() для обхода уровня хоста массива (localhost и 192.168.0.43), а затем использует array_filter() внутри него. Придется использовать use() для передачи массива поиска на каждый уровень функции
$array3 = array_map(function($data) use ($Array1)
{ return array_filter($data, function($sub) use ($Array1)
{ return in_array($sub["service_id"], $Array1); });
}, $Array2);
print_r($array3);
печатает ...
Array
(
[localhost] => Array
(
[0] => Array
(
[host_name] => localhost
[current_state] => 0
[service_id] => 158
)
)
[192.168.0.43] => Array
(
[1] => Array
(
[host_name] => 192.168.0.43
[current_state] => 1
[service_id] => 162
)
)
)