2015-08-08 135 views
2

我使用他们的DLAP API(我在学校建立了一个内部的学生信息系统)从GradPoint中的成绩册中取得成绩。这有点噩梦,因为它们的数组嵌套了很多次。下面是输出数组我需要从(与“已删除”,因为学生的数据替换一些值)检索数据:PHP:是否有更好的函数来循环多维数组

Array 
(
    [@attributes] => Array 
     (
      [code] => OK 
     ) 

    [enrollments] => Array 
     (
      [enrollment] => Array 
       (
        [@attributes] => Array 
         (
          [id] => REMOVED 
          [userid] => REMOVED 
          [entityid] => REMOVED 
          [roleid] => 0 
          [domainid] => REMOVED 
          [reference] => REMOVED 
          [guid] => REMOVED 
          [flags] => REMOVED 
          [status] => 1 
          [startdate] => 2015-07-30T06:00:00Z 
          [enddate] => 2015-12-17T06:59:00Z 
         ) 

        [data] => Array 
         (
          [status] => Array 
           (
            [performance] => Array 
             (
              [@attributes] => Array 
               (
                [signal] => Red 
                [code] => 2 
               ) 

             ) 

            [pace] => Array 
             (
              [@attributes] => Array 
               (
                [signal] => Green 
               ) 

             ) 

           ) 

         ) 

        [user] => Array 
         (
          [@attributes] => Array 
           (
            [id] => REMOVED 
            [firstname] => REMOVED 
            [lastname] => REMOVED 
            [reference] => REMOVED 
            [guid] => REMOVED 
            [userspace] => REMOVED 
            [username] => REMOVED 
            [email] => REMOVED 
            [lastlogindate] => 2015-08-07T21:43:46.11Z 
           ) 

         ) 

        [domain] => Array 
         (
          [@attributes] => Array 
           (
            [id] => REMOVED 
            [name] => REMOVED 
           ) 

         ) 

        [grades] => Array 
         (
          [@attributes] => Array 
           (
            [achieved] => 13.5 
            [possible] => 100 
            [letter] => F 
            [passingscore] => 0.8 
            [complete] => 0.5 
            [seconds] => 8331 
           ) 

          [categories] => Array 
           (
            [category] => Array 
             (
              [0] => Array 
               (
                [@attributes] => Array 
                 (
                  [id] => 15 
                  [name] => Assignments 
                  [achieved] => 27 
                  [possible] => 30 
                  [letter] => A 
                  [seconds] => 5580 
                 ) 

               ) 

              [1] => Array 
               (
                [@attributes] => Array 
                 (
                  [id] => 138 
                  [name] => Assessments 
                  [achieved] => 0 
                  [possible] => 25 
                  [letter] => F 
                  [seconds] => 2760 
                 ) 

               ) 

             ) 

           ) 

         ) 

       ) 

     ) 

) 

我试图让[等级]部分。具体而言,属于[属性]内部的@attributes中的数据。这是我的foreach代码:

foreach ($array_data as $key=>$value) 
{ 
    if($key == "enrollments") 
    { 
     foreach ($value as $key1=>$value1) 
     { 
      if($key1 == "enrollment") 
      { 
       foreach ($value1 as $key2=>$value2) 
       { 
        if($key2 == "grades") 
        { 
         foreach ($value2 as $key3=>$value3) 
         { 
          if($key3 == "@attributes") 
          { 
           foreach ($value3 as $key4=>$value4) 
           { 
            switch($key4) 
            { 
             case "achieved": 
              $gpAchieved = $value4; 
             break; 

             case "possible": 
              $gpPossible = $value4; 
             break; 

             case "letter": 
              $gpLetter = $value4; 
             break; 

             case "passingscore": 
              $gpPassingScore = $value4; 
             break; 

             case "complete": 
              $gpComplete = $value4; 
             break; 

             case "seconds": 
              $gpSeconds = $value4; 
             break; 
            } 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 

我的问题:我的巨大的foreach语句真的是检索这些数据的最佳方法吗?有没有一个函数可以遍历所有这些,并给我我想要的东西?

我需要做的是将这些值作为行表项输入到MySQL表中,作为fyi,这就是为什么我将这些值保存在变量中的原因。这个巨大的foreach将起作用,所以我没有要求分发。但是一定有更好的办法!

谢谢先进。

+1

也许'arrray_walk_recursive'是你所需要的http://php.net/manual/en/function.array- walk-recursive.php –

+1

你foreach看起来很丑陋,但即使你使用array_walk_recurisve或使用array_map函数,它仍然是大致相同的,性能wise.You可能想在这里尝试它也http://codereview.stackexchange。 com/ – Mihai

+1

这看起来像是将simplexml转换为数组...您可能更适合使用DomDocument api并使用xpath来磨合您的需求。尝试倾倒一个拥有多于一次注册的学生,你会明白为什么这个结果类型不是最好的。 – Orangepill

回答

1

如果您的数据结构总是相同的,您并不总是需要遍历每个字段,只需直接转到您想要的条目即可。

只有1报名返回,你能解决您的查找到这样的事情:

if (isset($arr_test['enrollments']['enrollment']['grades']['@attributes'])) { 
    $arr_gradesAttributes = $arr_test['enrollments']['enrollment']['grades']['@attributes']; 

    $gpAchieved = $arr_gradesAttributes['achieved']; 
    $gpPossible = $arr_gradesAttributes['possible']; 
    $gpLetter = $arr_gradesAttributes['letter']; 
    $gpPassingScore = $arr_gradesAttributes['passingscore']; 
    $gpComplete = $arr_gradesAttributes['complete']; 
    $gpSeconds = $arr_gradesAttributes['seconds']; 
} 

print("\$gpAchieved={$gpAchieved}, \$gpPossible={$gpPossible}, \$gpLetter={$gpLetter}, \$gpPassingScore={$gpPassingScore}, \$gpComplete={$gpComplete}, \$gpSeconds={$gpSeconds}"); 
+0

谢谢。这对我有效。虽然如果XML结构发生变化,它可能会中断,但对于我的场景,我至少可以控制哪些输出,它将起作用。另外,我现在将使用它来获取我需要的很多输出来获取数据。作为一个不是特定于我的问题的普遍答案,只要您知道关卡的级别和名称,该解决方案可以防止出现如此多的各种级别的错误。再次感谢。 –

+0

现在想起来,如果结构随输出而变化,即使我原来的巨大的foreach语句也会中断。我认为在这一点上,一个简单的IF语句来检查结构的结果将起作用。因此,如果输出结构关闭,请执行其他操作。如果有人发现这个问题很有用,请添加此评论,并想知道这个答案是否适用于结构变更。 –