Итак, у меня есть этот список массивов (я изменил значения в целях конфиденциальности);
$datalist = array(
1 =>
array(
"12.2.2.2",
"Netherlands 1",
"Hub 1",
"Password",
"Mfalse"
) ,
array(
"12.2.2.2",
"Singapore 1",
"Hub 2",
"Password 2",
"Mfalse"
)
И мне нужен вывод array2, который является «концентратором» и «концентратором 2». Итак, я сделал этот php-код, так как хочу, чтобы он был зациклен внутри таблицы, чтобы все детали были представлены в виде таблицы и упорядочены. Но единственное, что мне сейчас нужно, это показать HUB.
foreach ($response->monitors as $monitors) {
if (isset($monitors->id)){
echo
'<tr>
<td><i class = "fas fa-globe"></i> '.$monitors->friendly_name.'</td>';
foreach ($datalist as $key => $value) {
# code...
if (isset($key)) {
echo '<td>'.$value[2].'</td>';
}
}
echo '<td>'.$monitors->url.'</td>
<td>'.$monitors->status.'</td>
</tr>';
}
}
Поскольку я также использую другие выходные значения, и массив, который мне нужен, также находится внутри другого цикла foreach для таблицы.
Итак, основная проблема заключается в этой части, поскольку всякий раз, когда я использую это, он выводит вот так в каждом цикле таблицы
foreach ($datalist as $key => $value) {
# code...
if (isset($key)) {
echo '<td>'.$value[2].'</td>';
}
}
Выход:
Netherlands 1 Hub 1 Hub 2 12.2.2.2
Singapore 1 Hub 1 Hub 2 12.2.2.2
Но желаемый результат, который я ищу:
Netherlands 1 Hub 1 12.2.2.2
Singapore 1 Hub 2 12.2.2.2
Что может быть не так в моем операторе массива для foreach?
var_dump из $ datalist
array (
1 =>
array (
0 => 'x',
1 => 'Netherlands 1',
2 => 'PeenoiseSync',
3 => 'x',
4 => 'Mfalse',
),
2 =>
array (
0 => 'x',
1 => 'Singapore 1',
2 => 'PeenoiseSync',
3 => 'x',
4 => 'Mfalse',
),
3 =>
array (
0 => 'x',
1 => 'Singapore 2',
2 => 'PeenoiseSync',
3 => 'x',
4 => 'Mfalse',
),
4 =>
array (
0 => 'x',
1 => 'Singapore 3',
2 => 'PeenoiseSync',
3 => 'x',
4 => 'Mfalse',
),
5 =>
array (
0 => 'x',
1 => 'Singapore 4',
2 => 'PeenoiseSync',
3 => 'x',
4 => 'Mfalse',
),
6 =>
array (
0 => 'x',
1 => 'Singapore 5',
2 => 'PeenoiseSync',
3 => 'x',
4 => 'Mfalse',
),
7 =>
array (
0 => 'x',
1 => 'Singapore 6',
2 => 'PeenoiseSync',
3 => 'x',
4 => 'Mfalse',
),
8 =>
array (
0 => 'x',
1 => 'Singapore 7',
2 => 'YTAC',
3 => 'x',
4 => 'Mfalse',
),
)
Обновлено снова: желаемый результат должен быть примерно таким;

@AlbertoVidales Я использую api робота безотказной работы, который выводит какое-то имя, например SG-1 и т. д.
Мой вопрос: совпадает ли эта переменная со значением позиции 1 в ваших массивах?
Пожалуйста, var_dump($datalist); и опубликуйте результат, чтобы мы могли увидеть, как он построен фактически. Вы можете исключить определенные значения, если вам нужно, но не пытайтесь записать все от руки. Этот всегда работает плохо и приводит к предоставлению плохой информации.
@PatrickQ добавил дамп переменной $ datalist;
Похоже, вы подвергли цензуре ту ценность, которая, по вашему мнению, вам небезразлична. Пожалуйста, дайте нам что-нибудь, что мы можем использовать для получения результата, который вы примете. Вы должны обновить значения для 3-х элементов в подмассивах, а также предоставить желаемый результат, соответствующий обновленному $datalist.
Хорошо, я исправил это еще раз. Я добавил детали для названий хабов и добавил изображение желаемого результата.






Вы пропустили "после пароля 2"
$datalist = array(
1 =>
array(
"12.2.2.2",
"Netherlands 1",
"Hub 1",
"Password",
"Mfalse"
) ,
array(
"12.2.2.2",
"Singapore 1",
"Hub 2",
"Password 2",
"Mfalse"
)
);
foreach ($datalist as $key => $value) {
# code...
if (isset($key)) {
echo '<td>'.$value[2].'</td>';
}
}
тест здесь
Ой, извините, это была моя ошибка, когда я редактировал код, но на самом деле это есть ». Я исправлю это сразу.
Вам понадобится переменная для сравнения из $ monitors с $ value [1], поскольку он будет выводить всю информацию о массивах в $ datalist на каждую итерацию $ monitors. Я оставляю пример того, как вы можете решить эту проблему, но чтобы помочь вам также нужно будет знать, что именно выводит $ monitors-> friendly_name и что у вас есть в переменной $ monitors (возможно, есть что-то, что мы можем использовать для сравнения и сопоставления вашего массива $ datalist, соответствующего правильному монитору:
foreach ($datalist as $key => $value) {
# code...
if ($monitors->friendly_name == $value[1]) {
echo '<td>'.$value[2].'</td>';
}
Предполагая, что $ key всегда установлен (я не думаю, что foreach не будет устанавливать $ key в итерации), это выведет значение, соответствующее правильному значению массива для этого конкретного монитора.
$ monitors используется другим вызываемым мной API-интерфейсом, который не является частью массива, который я пытаюсь вывести. Мониторы $ работают должным образом, как и ожидалось, проблема возникает только с массивами, возможно, из-за моего аргумента в пользу цикла или чего-то еще.
Я знаю, что у вас нет контроля над данными мониторов, просто попробуйте найти переменную, в которой вы можете сравнивать $ monitors с каждым из ваших элементов массива, в этом случае, если значения совпадают, он выведет соответствующие данные, связанные к этому монитору, если нет, просто перейдите к следующему, пока он не найдет его, однажды верно, не забудьте оставить свой foreach, чтобы не тратить ресурсы после обнаружения.
Этот ответ предполагает, что ваш массив $datalist находится в том же порядке, что и ваш массив $monitors, и содержит такое же количество элементов. Вам просто нужно отслеживать, на каком мониторе вы находитесь, а затем использовать тот же индекс для доступа к соответствующей строке $datalist. Вы делаете это, устанавливая as $index=>$monitors, а затем используя $datalist[$index][2]
// re-indexing $datalist since in your example it is not 0-indexed
$datalist = array_values($datalist);
foreach ($response->monitors as $index=>$monitors) {
if (isset($monitors->id)){
echo
'<tr>
<td><i class = "fas fa-globe"></i> '.$monitors->friendly_name.'</td>';
echo '<td>'.$datalist[$index][2].'</td>';
echo '<td>'.$monitors->url.'</td>
<td>'.$monitors->status.'</td>
</tr>';
}
}
Это действительно хороший подход, но это может привести к беспорядочным реляционным данным, если они находятся в разном порядке.
@AlbertoVidales Это был смысл моей преамбулы. Если они не в одном порядке, то OP находится в затруднительном положении, поскольку, похоже, нет идентифицирующего общего значения между записями.
Кажется, довольно легко узнать, сможет ли он делать то, что он хочет, просто нужно точно знать, что есть у $ monitors (всего один элемент), чтобы мы могли сказать, что сравнивать, чтобы помочь ему, но хорошо , Я оставлю это здесь.
Это почти работает, но, к сожалению, есть пустая запись по первому значению. Я просто поиграю с этим и посмотрю, что я могу сделать. Спасибо!
$ monitors имеет много данных, но я в основном использую 3-4 данных; "id": 777749809, "friendly_name": "Google", "url": "http://www.google.com" "status": 1, Взято из uptimerobot api.
@Sync В $datalist, указанном в вашем вопросе, отсутствует индекс [0]. Это довольно странно для массива с числовым индексом. Однако вы можете просто запустить $datalist = array_values($datalist);, чтобы решить эту проблему. Я обновлю свой ответ, чтобы задуматься.
@Sync Рад помочь.
$ monitors-> friendly_name что это выводит?