在php中循环多维数组
我有一个多维数组,如下所示:在php中循环多维数组,php,arrays,loops,multidimensional-array,Php,Arrays,Loops,Multidimensional Array,我有一个多维数组,如下所示: array(2) { [1]=> array(3) { ["eventID"]=> string(1) "1" ["eventTitle"]=> string(7) "EVENT 1" ["artists"]=> array(3) { [4]=> array(2) { ["name"]=> string(8) "ARTI
array(2) {
[1]=>
array(3) {
["eventID"]=>
string(1) "1"
["eventTitle"]=>
string(7) "EVENT 1"
["artists"]=>
array(3) {
[4]=>
array(2) {
["name"]=>
string(8) "ARTIST 1"
["description"]=>
string(13) "artist 1 desc"
["links"]=>
array(2) {
[1]=>
array(2) {
["URL"]=>
string(22) "http://www.artist1.com"
}
[6]=>
array(2) {
["URL"]=>
string(24) "http://www.artist1-2.com"
}
}
}
[5]=>
array(2) {
["name"]=>
string(8) "ARTIST 8"
["description"]=>
string(13) "artist 8 desc"
["links"]=>
array(1) {
[8]=>
array(2) {
["URL"]=>
string(22) "http://www.artist8.com"
}
}
}
[2]=>
array(2) {
["ime"]=>
string(8) "ARTIST 5"
["opis"]=>
string(13) "artist 5 desc"
["links"]=>
array(1) {
[9]=>
array(2) {
["URL"]=>
string(22) "http://www.artist5.com"
}
}
}
}
}
[2]=>
array(3) {
["eventID"]=>
string(1) "2"
["eventTitle"]=>
string(7) "EVENT 2"
["artists"]=>
array(3) {
[76]=>
array(2) {
["name"]=>
string(9) "ARTIST 76"
["description"]=>
string(14) "artist 76 desc"
["links"]=>
array(1) {
[13]=>
array(2) {
["URL"]=>
string(23) "http://www.artist76.com"
}
}
}
[4]=>
array(2) {
["name"]=>
string(8) "ARTIST 4"
["description"]=>
string(13) "artist 4 desc"
["links"]=>
array(1) {
[11]=>
array(2) {
["URL"]=>
string(22) "http://www.artist4.com"
}
}
}
}
}
}
我希望html输出如下:
--
事件1艺术家1
艺术家1描述
, 艺术家8
艺术家8描述
艺术家5
艺术家5描述
-- 事件2
艺术家76
艺术家76描述
艺术家4
艺术家4描述
-- 等等 我对数组中越来越深的挖掘感到困惑,尤其是当我的数组键不是序列号而是艺术家/链接/等的ID时。
老实说,这些阵列会杀了我的!=)
谢谢你的帮助 foreach语句将为您处理所有这些,包括关联哈希。像这样:
foreach($array as $value) {
foreach($value as $key => $val) {
if($key == "links") {
}
/* etc */
}
}
最好使用
foreach
构造在数组上循环。以下内容未经测试,我想不起来(因此可能没有经过深思熟虑!),但应该给你一个良好的开端:
foreach ($mainArray as $event)
{
print $event["eventTitle"];
foreach ($event["artists"] as $artist)
{
print $artist["name"];
print $artist["description"];
$links = array();
foreach ($artist["links"] as $link)
{
$links[] = $link["URL"];
}
print implode(",", $links);
}
}
我认为一个很好的方法是“自下而上”,即找出如何处理最内在的价值观,然后利用这些结果计算出下一个层次,依此类推,直到我们到达顶部。尽可能多地用小的、单一用途的、可重用的函数编写代码也是一种很好的做法,所以这就是我要做的 请注意,我假设您的数据是安全的(即,它不是由潜在的恶意用户提供的)。我还假设键“ime”和“opi”与其他数组的“name”和“description”匹配;) 我们可以忽略最里面的字符串本身,因为我们不需要修改它们。在这种情况下,我能看到的最内部的结构是单个链接,它们是包含“URL”值的数组。下面是一些用于呈现单个链接的代码:
function render_link($link) {
return "<a href='{$link['URL']}'>{$link['URL']}</a>";
}
这已删除另一层,例如:
// Input
array('URL' => "http://www.artist1.com")
// Output
"<a href='http://www.artist1.com'>http://www.artist1.com</a>"
// Input
array(1 => array('URL' => "http://www.artist1.com"),
6 => array('URL' => "http://www.artist1-2.com"))
// Output
"<a href='http://www.artist1.com'>http://www.artist1.com</a>, <a href='http://www.artist1-2.com'>http://www.artist1-2.com</a>"
// Input
array('name' => 'ARTIST 1',
'description' => 'artist 1 desc',
'links' => array(
1 => array(
'URL' => 'http://www.artist1.com')
6 => array(
'URL' => 'http://www.artist1-2.com')))
// Output
"ARTIST 1
<br />
artist 1 desc
<br />
<a href='http://www.artist1.com'>http://www.artist1.com</a>, <a href='http://www.artist1-2.com'>http://www.artist1-2.com</a>"
然而,如果我们想要更多的挑战,我们可以尝试重构我们刚刚编写的代码,以减少冗余,提高可重用性。一个简单的步骤是去掉渲染链接、渲染艺术家和渲染事件,因为它们都是更一般模式的变体:
function reduce_with($renderer, $separator, $array) {
return implode($separator, array_map($renderer, $array));
}
function render_artist($artist) {
$artist['links'] = reduce_with('render_link', ', ', $artist['links']);
return implode("\n<br />\n", $artist);
}
function render_event($event) {
unset($event['eventID']);
$event['eventTitle'] = "<strong>{$event['eventTitle']}</strong>";
$event['artists'] = reduce_with('render_artist',
"\n<br /><br />\n",
$event['artists']);
return implode("\n<br />\n", $event);
}
echo reduce_with('render_event', "\n<br /><br />--<br /><br />", $my_data);
使用($renderer,$separator,$array)的函数reduce\u{
返回内爆($separator,array_map($renderer,$array));
}
函数render_artist($artist){
$artist['links']=使用('render_link'、'、'和$artist['links'])减少_;
返回内爆(“\n
\n”,$artist);
}
函数render_event($event){
未设置($event['eventID']);
$event['eventTitle']=“{$event['eventTitle']}”;
$event['artists']=使用('render\u artist')减少,
“\n
\n”,
$event['artists']);
返回内爆(“\n
\n”,$event);
}
使用('render_event',“\n
--
,$my_data”)回送reduce_;
如果这是一个更大的应用程序的一部分,我们可能需要梳理出一些更通用的模式。这使得代码稍微复杂一些,但更易于重用。以下是我发现的一些模式:
// Re-usable library code
// Partial application: apply some arguments now, the rest later
function papply() {
$args1 = func_get_args();
return function() use ($args1) {
return call_user_func_array(
'call_user_func',
array_merge($args1, func_get_args()));
};
}
// Function composition: chain functions together like a(b(c(...)))
function compose() {
$funcs = array_reverse(func_get_args());
$first = array_shift($funcs);
return function() use ($funcs, $first) {
return array_reduce($funcs,
function($x, $f) { return $f($x); },
call_user_func_array($first, func_get_args()));
};
}
// Transform or remove a particular element in an array
function change_elem($key, $func, $array) {
if is_null($func) unset($array[$key]);
else $array[$key] = $func($array[$key]);
return $array;
}
// Transform all elements then implode together
function reduce_with($renderer, $separator) {
return compose(papply('implode', $separator),
papply('array_map', $renderer));
}
// Wrap in HTML
function tag($tag, $text) {
return "<{$tag}>{$text}</{$tag}>";
}
// Problem-specific code
function render_link($link) {
return "<a href='{$link['URL']}'>{$link['URL']}</a>";
}
$render_artist = compose(
papply('implode', "\n<br />\n"),
papply('change_elem', 'links', papply('reduce_with',
'render_link',
', '));
$render_event = compose(
papply('implode', "\n<br />\n"),
papply('change_elem', null, 'eventID'),
papply('change_elem', 'eventTitle', papply('tag', 'strong')),
papply('change_elem', 'artists', papply('reduce_with',
$render_artist,
"\n<br /><br />\n")));
echo reduce_with($render_event, "\n<br /><br />--<br /><br />", $my_data);
//可重复使用的库代码
//部分应用:现在应用一些参数,其余的稍后应用
函数papply(){
$args1=func_get_args();
返回函数()用法($args1){
返回调用\用户\函数\数组(
“调用用户函数”,
数组合并($args1,func_get_args());
};
}
//函数组合:像a(b(c(…))一样将函数链在一起
函数compose(){
$funcs=array_reverse(func_get_args());
$first=数组移位($funcs);
return function()使用($funcs,$first){
返回数组\u reduce($funcs,
函数($x,$f){返回$f($x);},
调用_user_func_数组($first,func_get_args());
};
}
//变换或删除数组中的特定元素
函数更改元素($key、$func、$array){
如果为空($func)未设置($array[$key]);
else$array[$key]=$func($array[$key]);
返回$array;
}
//变换所有元素,然后一起内爆
带有($renderer,$separator)的函数reduce_{
返回compose(papply(‘内爆’,$separator),
papply('array_map',$renderer));
}
//用HTML包装
函数标记($tag,$text){
返回“{$text}”;
}
//问题特定代码
函数render\u link($link){
返回“”;
}
$render\u artist=compose(
papply('内爆',“\n
\n”),
papply('change_elem','links',papply('reduce_with',
“渲染链接”,
', '));
$render\u event=compose(
papply('内爆',“\n
\n”),
papply('change_elem',null,'eventID'),
papply('change_elem','eventTitle',papply('tag','strong'),
papply('change_elem','artists',papply('reduce_with',
$render_艺术家,
“\n
\n”);
使用($render_event,“\n
--
,$my_data”)回送reduce_;
谢谢你们两位的帮助!!!这个例子看起来更好,所以我选择这个作为答案,但我也会奖励另一个答案,因为我发现它和这个一样有用=)
function render_artists($artists) {
$rendered = array_map('render_artist', $artists);
return implode("\n<br /><br />\n", $rendered);
}
function render_event($event) {
unset($event['eventID']);
$event['eventTitle'] = "<strong>{$event['eventTitle']}</strong>";
$event['artists'] = render_artists($event['artists']);
return implode("\n<br />\n", $event);
}
function render_events($events) {
$rendered = array_map('render_event', $events);
return implode("\n<br /><br />--<br /><br />", $rendered);
}
echo render_events($my_data);
function reduce_with($renderer, $separator, $array) {
return implode($separator, array_map($renderer, $array));
}
function render_artist($artist) {
$artist['links'] = reduce_with('render_link', ', ', $artist['links']);
return implode("\n<br />\n", $artist);
}
function render_event($event) {
unset($event['eventID']);
$event['eventTitle'] = "<strong>{$event['eventTitle']}</strong>";
$event['artists'] = reduce_with('render_artist',
"\n<br /><br />\n",
$event['artists']);
return implode("\n<br />\n", $event);
}
echo reduce_with('render_event', "\n<br /><br />--<br /><br />", $my_data);
// Re-usable library code
// Partial application: apply some arguments now, the rest later
function papply() {
$args1 = func_get_args();
return function() use ($args1) {
return call_user_func_array(
'call_user_func',
array_merge($args1, func_get_args()));
};
}
// Function composition: chain functions together like a(b(c(...)))
function compose() {
$funcs = array_reverse(func_get_args());
$first = array_shift($funcs);
return function() use ($funcs, $first) {
return array_reduce($funcs,
function($x, $f) { return $f($x); },
call_user_func_array($first, func_get_args()));
};
}
// Transform or remove a particular element in an array
function change_elem($key, $func, $array) {
if is_null($func) unset($array[$key]);
else $array[$key] = $func($array[$key]);
return $array;
}
// Transform all elements then implode together
function reduce_with($renderer, $separator) {
return compose(papply('implode', $separator),
papply('array_map', $renderer));
}
// Wrap in HTML
function tag($tag, $text) {
return "<{$tag}>{$text}</{$tag}>";
}
// Problem-specific code
function render_link($link) {
return "<a href='{$link['URL']}'>{$link['URL']}</a>";
}
$render_artist = compose(
papply('implode', "\n<br />\n"),
papply('change_elem', 'links', papply('reduce_with',
'render_link',
', '));
$render_event = compose(
papply('implode', "\n<br />\n"),
papply('change_elem', null, 'eventID'),
papply('change_elem', 'eventTitle', papply('tag', 'strong')),
papply('change_elem', 'artists', papply('reduce_with',
$render_artist,
"\n<br /><br />\n")));
echo reduce_with($render_event, "\n<br /><br />--<br /><br />", $my_data);