如何在php中即兴创建这个嵌套for循环?

如何在php中即兴创建这个嵌套for循环?,php,for-loop,nested,Php,For Loop,Nested,现在我正试图打印一个json对象,它看起来像这样 { "name" : "Zeninjor Enwemeka", "title" : "At Boston Forum, Federal And Local Officials Discuss Regions Transportation Future", "published" : "Friday, February 19, 2016", media: [ {audio : http://foo.bar.m

现在我正试图打印一个json对象,它看起来像这样

{
    "name" : "Zeninjor Enwemeka",
    "title" : "At Boston Forum, Federal And Local Officials Discuss Regions Transportation Future",
    "published" : "Friday, February 19, 2016",
    media: [
    {audio : http://foo.bar.mp4, duration : 00:04:14}
    {image : http://s3.amazonaws.com/media.wbur.org/wordpress/1/files/2015/08/0213_am-traffic02.jpg, credit : Jesse Costa/WBUR, caption : The Boston area ranks sixth for gridlock-plagued commutes in 2014. Here's morning traffic on Route 1 into Boston in February.}
    ]
},

{
    "name" : "Zeninjor Enwemeka",
    "title" : "Bostons Transportation Future? City Releases Report Detailing Publics Transit Goals",
    "published" : "Friday, February 19, 2016",
},

{
    "name" : "Ryan Caron King",
    "title" : "Sen. Murphy Seeks Feedback From Fed Up Car Commuters",
    "published" : "Friday, February 19, 2016",
},

{
    "name" : "Patrick Skahill",
    "title" : "Solar Installations Skyrocket, But Connecticut Consumers Still Need To Do Their Homework",
    "published" : "Thursday, October 15, 2015",
    media: [
    {image : http://foo.bar.jpg, credit : AP, caption : Some news story caption}
    ]
}
这是我的代码:

if (mysqli_num_rows($result) > 0) {
    $data_array = array();
    while($row = mysqli_fetch_assoc($result)) {
        //echo "Story id:" . $row["id"] . "<br>";
        $data_array[$row["id"]]['name']=ucwords($row["name"]);
        $data_array[$row["id"]]['title']=ucwords($row["title"]);
        $date=date_create($row['published']);
        $edited_date=date_format($date,"l, F d, Y");
        $data_array[$row["id"]]['published']=$edited_date; 
    }
} else {
    echo "0 results";
} 
$json_media = json_decode($media,true);
foreach($json_media as $row) {
    if ($data_array[$row['story']]['media'] == 0) {
        $data_array[$row['story']]['media'] = array();
    }
    array_push($data_array[$row['story']]['media'], $row);
}
//print_r($data_array);
echo "\n\n";
$numItems = count($data_array);
$i=0;
foreach ($data_array as $key => $stories) {
echo "{\n";
    foreach ($stories as $entity => $data) {
        if ($entity != "media") {
           echo "\t\"" . $entity."\" : \"".$data."\",\n";
        } else {
            echo "\tmedia: [\n";
            foreach($data as $media => $media_element) {
                foreach($media_element as $media_entities => $media_entity) {
                    if($media_entity == 'jpg') {
                        echo "\t{image : ".$media_element['href'].",";
                        echo " credit : ".$media_element['credit'].",";
                        echo " caption : ".$media_element['caption']."}\n";
                    }
                    else if($media_entity == 'mp4') {
                        echo "\t{audio : ".$media_element['href'].",";
                        echo " duration : ".gmdate("H:i:s",$media_element['duration'])."}\n";
                    }
                }
            }
            echo "\t]\n";
        }
    }
    if(++$i === $numItems) {
    echo "}\n\n";
    }
    else {
    echo "},\n\n";
    }
}

这将导致相同的结果:

$json_media = json_decode($media,true);

$data_array = array();

if (mysqli_num_rows($result) > 0) {
    while($row = mysqli_fetch_assoc($result)) {
        //echo "Story id:" . $row["id"] . "<br>";
        $data_array[$row["id"]]['name']=ucwords($row["name"]);
        $data_array[$row["id"]]['title']=ucwords($row["title"]);
        $date=date_create($row['published']);
        $edited_date=date_format($date,"l, F d, Y");
        $data_array[$row["id"]]['published']=$edited_date;
   }
} else {
    echo "0 results";
}

foreach($json_media as $row) {
    $id = $row['story'];
    if ( ! isset( $data_array[ $id ]['media'] ) ) {
        $data_array[ $id ]['media'] = array();
    }
    $type = ( $row['type'] == 'jpg' ) ? 'image': 'audio';
    // for more types, you could use a switch() here

    $row[ $type ] = $row['href'];

    if ( isset( $row['duration'] ) ) {
        $row['duration'] = gmdate("H:i:s", $row['duration'] );
    }

    // remove all not needed data
    unset( $row['story'], $row['type'], $row['href'] );
    array_push( $data_array[ $id ]['media'], $row );
}

echo json_encode( $data_array );
$json\u media=json\u decode($media,true);
$data_array=array();
如果(mysqli_num_行($result)>0){
while($row=mysqli\u fetch\u assoc($result)){
//echo“故事id:.”行[“id”]。“
”; $data_数组[$row[“id”]['name']=ucwords($row[“name”]); $data_数组[$row[“id”]['title']=ucwords($row[“title”]); $date=创建日期($row['published']); $edited_date=日期格式($date,“l,F,d,Y”); $data\u数组[$row[“id”]['published']=$edited\u日期; } }否则{ 回显“0结果”; } foreach($json\u媒体作为$row){ $id=$row['story']; 如果(!isset($data_array[$id]['media'])){ $data_数组[$id]['media']=array(); } $type=($row['type']='jpg')?'image':'audio'; //对于更多类型,可以在此处使用switch() $row[$type]=$row['href']; 如果(isset($row['duration'])){ $row['duration']=gmdate(“H:i:s,$row['duration']); } //删除所有不需要的数据 未设置($row['story'],$row['type'],$row['href']); 数组推送($data_数组[$id]['media'],$row); } echo json_encode($data_数组);

基本上,当媒体数据被添加到
$data\u数组中时,我正在改进/设置媒体数据,这样,您就不必再次遍历所有内容:)

为什么
echo
每个项目,而不仅仅是
echo json\u encode($data\u数组)
?(或者
var\u dump()
print\u r()
)基本上,您可以有两个步骤:1)从数据库获取数据,检查/改进某些值,并将其添加到
$data\u数组
然后2)
echo json\u encode($data\u数组)这就是问题所在-并非所有数据都来自数据库。一半来自db,另一半来自api。我正在尝试合并。在我的第二个数组中,我尝试合并两个数组。还是要避免这么多for循环?你能举一个非DB数组的(缩短的)例子吗?(我猜
$media
?)我可能可以改进合并部分-但是访问部分变脏了-我的意思是循环太多了!完美的非常感谢菲利普!
$json_media = json_decode($media,true);

$data_array = array();

if (mysqli_num_rows($result) > 0) {
    while($row = mysqli_fetch_assoc($result)) {
        //echo "Story id:" . $row["id"] . "<br>";
        $data_array[$row["id"]]['name']=ucwords($row["name"]);
        $data_array[$row["id"]]['title']=ucwords($row["title"]);
        $date=date_create($row['published']);
        $edited_date=date_format($date,"l, F d, Y");
        $data_array[$row["id"]]['published']=$edited_date;
   }
} else {
    echo "0 results";
}

foreach($json_media as $row) {
    $id = $row['story'];
    if ( ! isset( $data_array[ $id ]['media'] ) ) {
        $data_array[ $id ]['media'] = array();
    }
    $type = ( $row['type'] == 'jpg' ) ? 'image': 'audio';
    // for more types, you could use a switch() here

    $row[ $type ] = $row['href'];

    if ( isset( $row['duration'] ) ) {
        $row['duration'] = gmdate("H:i:s", $row['duration'] );
    }

    // remove all not needed data
    unset( $row['story'], $row['type'], $row['href'] );
    array_push( $data_array[ $id ]['media'], $row );
}

echo json_encode( $data_array );