Массив эха внутри foreach и если установлен, но отображать только одни данные для каждого значения

Итак, у меня есть этот список массивов (я изменил значения в целях конфиденциальности);

$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',
 ),
)

Обновлено снова: желаемый результат должен быть примерно таким; Массив эха внутри foreach и если установлен, но отображать только одни данные для каждого значения

Вывод, который я получаю; Массив эха внутри foreach и если установлен, но отображать только одни данные для каждого значения

$ monitors-> friendly_name что это выводит?

Alberto Vidales 17.07.2018 19:27

@AlbertoVidales Я использую api робота безотказной работы, который выводит какое-то имя, например SG-1 и т. д.

Sync 17.07.2018 19:28

Мой вопрос: совпадает ли эта переменная со значением позиции 1 в ваших массивах?

Alberto Vidales 17.07.2018 19:32

Пожалуйста, var_dump($datalist); и опубликуйте результат, чтобы мы могли увидеть, как он построен фактически. Вы можете исключить определенные значения, если вам нужно, но не пытайтесь записать все от руки. Этот всегда работает плохо и приводит к предоставлению плохой информации.

Patrick Q 17.07.2018 19:32

@PatrickQ добавил дамп переменной $ datalist;

Sync 17.07.2018 19:41

Похоже, вы подвергли цензуре ту ценность, которая, по вашему мнению, вам небезразлична. Пожалуйста, дайте нам что-нибудь, что мы можем использовать для получения результата, который вы примете. Вы должны обновить значения для 3-х элементов в подмассивах, а также предоставить желаемый результат, соответствующий обновленному $datalist.

Patrick Q 17.07.2018 19:49

Хорошо, я исправил это еще раз. Я добавил детали для названий хабов и добавил изображение желаемого результата.

Sync 17.07.2018 19:52
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
7
758
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы пропустили "после пароля 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>';
                        }
                    }

тест здесь

http://phpfiddle.org

Ой, извините, это была моя ошибка, когда я редактировал код, но на самом деле это есть ». Я исправлю это сразу.

Sync 17.07.2018 19:48

Вам понадобится переменная для сравнения из $ 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-интерфейсом, который не является частью массива, который я пытаюсь вывести. Мониторы $ работают должным образом, как и ожидалось, проблема возникает только с массивами, возможно, из-за моего аргумента в пользу цикла или чего-то еще.

Sync 17.07.2018 19:56

Я знаю, что у вас нет контроля над данными мониторов, просто попробуйте найти переменную, в которой вы можете сравнивать $ monitors с каждым из ваших элементов массива, в этом случае, если значения совпадают, он выведет соответствующие данные, связанные к этому монитору, если нет, просто перейдите к следующему, пока он не найдет его, однажды верно, не забудьте оставить свой foreach, чтобы не тратить ресурсы после обнаружения.

Alberto Vidales 17.07.2018 20:04
Ответ принят как подходящий

Этот ответ предполагает, что ваш массив $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>';
    }
}

Это действительно хороший подход, но это может привести к беспорядочным реляционным данным, если они находятся в разном порядке.

Alberto Vidales 17.07.2018 20:02

@AlbertoVidales Это был смысл моей преамбулы. Если они не в одном порядке, то OP находится в затруднительном положении, поскольку, похоже, нет идентифицирующего общего значения между записями.

Patrick Q 17.07.2018 20:06

Кажется, довольно легко узнать, сможет ли он делать то, что он хочет, просто нужно точно знать, что есть у $ monitors (всего один элемент), чтобы мы могли сказать, что сравнивать, чтобы помочь ему, но хорошо , Я оставлю это здесь.

Alberto Vidales 17.07.2018 20:08

Это почти работает, но, к сожалению, есть пустая запись по первому значению. Я просто поиграю с этим и посмотрю, что я могу сделать. Спасибо!

Sync 17.07.2018 20:13

$ monitors имеет много данных, но я в основном использую 3-4 данных; "id": 777749809, "friendly_name": "Google", "url": "http://www.google.com" "status": 1, Взято из uptimerobot api.

Sync 17.07.2018 20:15

@Sync В $datalist, указанном в вашем вопросе, отсутствует индекс [0]. Это довольно странно для массива с числовым индексом. Однако вы можете просто запустить $datalist = array_values($datalist);, чтобы решить эту проблему. Я обновлю свой ответ, чтобы задуматься.

Patrick Q 17.07.2018 20:22

@Sync Рад помочь.

Patrick Q 17.07.2018 20:30

Другие вопросы по теме