我使用他们的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将起作用,所以我没有要求分发。但是一定有更好的办法!
谢谢先进。
也许'arrray_walk_recursive'是你所需要的http://php.net/manual/en/function.array- walk-recursive.php –
你foreach看起来很丑陋,但即使你使用array_walk_recurisve或使用array_map函数,它仍然是大致相同的,性能wise.You可能想在这里尝试它也http://codereview.stackexchange。 com/ – Mihai
这看起来像是将simplexml转换为数组...您可能更适合使用DomDocument api并使用xpath来磨合您的需求。尝试倾倒一个拥有多于一次注册的学生,你会明白为什么这个结果类型不是最好的。 – Orangepill