【问题标题】:How to loop through unstructured multidimensional array如何遍历非结构化多维数组
【发布时间】:2019-04-04 08:08:00
【问题描述】:

我对来自 Web 服务的 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 |部门名称 |部门简称 |活动ID |开始日期 |结束日期 |开始时间 |结束时间 |小时代码 | foreign_hour_code |金额 |类型 |人工成本

【问题讨论】:

  • 我可以猜到你想要什么。如果向我们展示您到目前为止所尝试的内容,将会有所帮助。它给了我们一些可以使用的东西。顺便说一句:数组远非“非结构化”。
  • @KIKOSoftware 我添加了我的尝试。但由于每个员工的结构不同,我无法获得所有结果。
  • 我明白了,数组的结构并不总是完全相同,所以你不能对它做出死板的反应。而是对您遇到的领域做出反应。更难回答您的问题的是,我可以看到您只向我们展示了数组的一小部分,但我会试一试。

标签: php soap


【解决方案1】:

我将从查看“项目”开始这个答案。值得注意的是,当只有 1 个项目时,在 'items' 中,它立即存在,但如果有多个项目,则使用项目的数字数组。因此,让我们为此创建一些函数,以纠正这种不一致。

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() 函数,它对数组的结构做出反应。

【讨论】:

    猜你喜欢
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 2012-04-16
    相关资源
    最近更新 更多