PHP эхо-данные из вложенного массива (foreach l oop) - PullRequest
0 голосов
/ 30 апреля 2020

У меня проблемы с отображением данных массива из вложенного массива, мой массив (для одного заказа) выглядит следующим образом ...

Array
(
    [buyer_name] => Mr Smith
    [buyer_phone] => 01234 567890
    [buyer_email] => mygreatemail@fakeemail.com
    [items] => Array
        (
            [0] => Array
                (
                    [quantity] => 3
                    [item_title] => title 1
                    [custom_label] => JD3433
                    [item_variation] => Variation detail for title 1
                    [price] => £8.00
                )

            [1] => Array
                (
                    [quantity] => 1
                    [item_title] => title 2
                    [custom_label] => JD5544
                    [item_variation] => Variation detail for title 2
                    [price] => £7.00
                )

        )

)  

Генерируется из этого кода ...

 function readCSV($csvFile)
    {
        $output = [];
        $fileHandle = fopen($csvFile, 'r');
        $header = fgetcsv($fileHandle);
        while (!feof($fileHandle)) {
            $fileRow = fgetcsv($fileHandle, 1024);
            $orderId = $fileRow[0];
            // skip this row if it's empty (the first field contains no id)
            if (empty($orderId)) {
                continue;
            }
            /*
              $fileRow[3] is "Buyer name", the first field that's present in one type of row
              (the one containing common properties of the order). By checking if it's empty,
              we identify the contents of the row - not empty means order row with common
              properties, empty means item row with specific item properties.
             */
            if (!empty($fileRow[3])) {
                // no need to repeat the id inside the array - it's already stored in the key
                $output[$orderId] = [
                    'sales_record' => $fileRow[0],
                    'order_number' => $fileRow[1],
                    'buyer_username' => $fileRow[2],
                    'buyer_name' => $fileRow[3],
                    // here you can continue explicitly adding any property you need
                ];
            } else {
                // add a new item entry
                $output[$orderId]['items'][] = [
                    'item_number' => $fileRow[20],
                    'item_title' => $fileRow[21],
                    'quantity' => $fileRow[24],
                    'price' => $fileRow[25],
                    // here you can continue explicitly adding any property you need
                ];
            }
        }
        fclose($fileHandle);

        return $output;
    }

Я могу без проблем отображать отдельные данные основного массива, используя ..

foreach($csv as $order) {
echo "Sales Record: "; echo $order[sales_record]; 
}

Но возникают проблемы при попытке отобразить данные вложенного массива.

Здесь я прочитал много похожих вопросов и попробовал ..

foreach($csv[$orderId]['items'] as $orderitems) {
echo $orderitems; echo "<br>";

}

без удачи, что я делаю не так, пожалуйста?

РЕДАКТИРОВАТЬ ДОБАВИТЬ ...

Если я не могу отобразить массив таким образом, тогда это приведет к тому, что я буду использовать множество операторов «если» (в заказе может быть более 100 элементов), а ниже приведен только пример «заголовка», я должен был бы повторить несколько сотен раз для Для каждого элемента во вложенном массиве должен быть лучший способ добиться этого ??

    if ($order[items][0][item_title] != "") { echo $order[items][0][item_title]; echo "<br>"; } else {}
    if ($order[items][1][item_title] != "") { echo $order[items][1][item_title]; echo "<br>"; } else {}
    if ($order[items][2][item_title] != "") { echo $order[items][2][item_title]; echo "<br>"; } else {}

//and so on

1 Ответ

1 голос
/ 30 апреля 2020

Сначала ключи массива должны быть в кавычках:

  • нет: $order[items][0][item_title]

  • да: $order['items'][0]['item_title']

Обычно ваша PHP версия выдает предупреждение:

Предупреждение: использование неопределенной константы item_title - предполагается 'item_title' (это приведет к ошибке в будущем версия PHP)

Вы можете выполнить итерацию по массиву:

foreach($order['items'] as $item) {
  echo $item['item_title']."<br/>";
}

Если у вас есть вложенный массив (массив заказов и каждый заказ имеет массив элементов) вы можете вкладывать foreach.

$orders = readCSV('filename.csv');

foreach ($orders as $orderId=>$order) {    
  foreach($order['items'] as $item) {
    if (!empty($item['item_title'])) echo $item['item_title']."<br/>";
  }
}

. concat две строки. Вам не нужны две эхо-команды.

Обратите внимание на формулировку, которая делает код более читабельным.

foreach (<plural> as <singular>)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...