Как перебрать неструктурированный многомерный массив - PullRequest
0 голосов
/ 04 апреля 2019

У меня проблема с ответом SOAP от веб-службы. Ответ представляет собой многомерный массив с различной структурой для каждого сотрудника.

Я попытался использовать цикл foreach, чтобы получить все значения и сохранить их в базе данных mysql.

Array
(
    [item] => Array
        (
            [0] => Array
                (
                    [department_id] => 1
                    [department_name] => Sales
                    [department_shortname] => SA
                    [hours] => Array
                        (
                            [item] => Array
                                (
                                    [activity_id] => 1
                                    [start_date] => 2019-03-12
                                    [end_date] => 2019-03-12
                                    [start_time] => 10:00
                                    [end_time] => 14:20
                                    [hour_code] => 0
                                    [foreign_hour_code] => 20
                                    [amount] => 3.83
                                    [type] => productive
                                    [labor_cost] => 25.23
                                )

                        )

                )

            [1] => Array
                (
                    [department_id] => 2
                    [department_name] => POS
                    [department_shortname] => POS
                    [hours] => Array
                        (
                            [item] => Array
                                (
                                    [activity_id] => 1
                                    [start_date] => 2019-03-12
                                    [end_date] => 2019-03-12
                                    [start_time] => 14:35
                                    [end_time] => 17:00
                                    [hour_code] => 0
                                    [foreign_hour_code] => 20
                                    [amount] => 2.42
                                    [type] => productive
                                    [labor_cost] => 24.67
                                )

                        )

                )

        )

)


Array
(
    [item] => Array 
        (
            [department_id] => 2
            [department_name] => POS
            [department_shortname] => POS
            [hours] => Array
                (
                    [item] => Array
                        (
                            [0] => Array
                                (
                                    [activity_id] => 1
                                    [start_date] => 2019-03-13
                                    [end_date] => 2019-03-13
                                    [start_time] => 07:30
                                    [end_time] => 12:00
                                    [hour_code] => 0
                                    [foreign_hour_code] => 20
                                    [amount] => 4.25
                                    [type] => productive
                                    [labor_cost] => 40.48
                                )

                            [1] => Array
                                (
                                    [activity_id] => 1
                                    [start_date] => 
                                    [end_date] => 
                                    [start_time] => 
                                    [end_time] => 
                                    [hour_code] => 
                                    [foreign_hour_code] => 63
                                    [amount] => 2
                                    [type] => none
                                    [labor_cost] => 0
                                )

                        )

                )

        )


Я пробовал это, но я не получаю все данные.

foreach($array as $employees)
{
  foreach($employees as $employee)
  {
    foreach($employee as $days)
    {
        foreach($days as $day)
        {
          foreach($day as $item)
          {
            foreach($item as $stores)
            {
              foreach($stores as $store)
              {
                foreach($store as $item1)
                {
                  foreach($item1 as $item2)
                  {
                    foreach($item2 as $hours)
                    {
                      foreach($hours as $hour)
                      {
                        foreach($hour as $booking)
                        {
                          /*
                          Store in DB per time registration.

                          $hours['department_id']
                          $hours['department_name']
                          $hours['department_shortname']

                          $booking[activity_id]
                          $booking[start_date]
                          $booking[end_date]
                          $booking[start_time]
                          $booking[end_time]
                          $booking[hour_code]
                          $booking[foreign_hour_code]
                          $booking[amount]
                          $booking[type]
                          $booking[labor_cost]
                          */
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
    }
  }
}

Я хочу просмотреть все элементы и сохранить их в базе данных при каждой регистрации.

Department_id | название отдела | короткое имя отдела | Activity_id | дата начала | дата окончания | время начала | end_time | часовой код | Foreign_hour_code | количество | тип | labor_cost

1 Ответ

0 голосов
/ 04 апреля 2019

Я начну этот ответ с рассмотрения «пунктов». Что примечательно, так это то, что когда в «элементах» есть только 1 элемент, он сразу появляется, но если имеется несколько элементов, используется числовой массив элементов. Поэтому давайте сделаем для этого некоторые функции, просто чтобы исправить это несоответствие.

function getItems($itemArray)
{
  // get the items in the item array
  $items = $itemArray['item'];
  // multiple items, in a numeric array, are returned as they are
  if (array_keys($items) === range(0, count($items) - 1) return $items;
  // whereas a single items is placed in a numeric array
  return [$items];
}

Мы можем применить это к любым «пунктам».

Теперь у меня проблема, потому что вы не дали мне достаточно информации. Я не знаю, к чему вы относите эти два массива. Поэтому я должен предположить, что вы можете получить их. Это предметы. Давайте дадим им имя: «начальная точка». Это выбрано совершенно случайно.

function processStartpoint($startpoint)
{
    // first get the department items
    $departments = getItems($startpoint);
    // process each department
    foreach ($departments as $department) {
        // get department info
        $departmentId        = $department['department_id'];
        $departmentName      = $department['department_name'];
        $departmentShortName = $department['department_shortname'];  
        // walk through each hour
        foreach (getItems($department['hours']) as $hour) {
            // get hour info
            $ActivityId      = $hour['activity_id'];
            $StartDate       = $hour['start_date']; 
            $EndDate         = $hour['end_date']; 
            $StartTime       = $hour['start_time']; 
            $EndTime         = $hour['end_time'];
            $HourCode        = $hour['hour_code']; 
            $ForeignHourCode = $hour['foreign_hour_code']; 
            $Amount          = $hour['amount'];
            $Type            = $hour['type'];
            $LaborCost       = $hour['labor_cost']; 
            /*
              store this in your database
            */
        }
    }
}

Теперь у меня нет реального способа проверить, работает ли этот код, но что-то вроде этого будет. Настоящий трюк в функции getItems(), она реагирует на структуру массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...