Maison >développement back-end >tutoriel php >求助:格式化这样的一个json串,语法该怎么写?()

求助:格式化这样的一个json串,语法该怎么写?()

WBOY
WBOYoriginal
2016-06-23 14:00:20995parcourir

例如有一个二维数组 
$myarrnews=array();
$myarrnews =explode("||**||", $mystr); //内容来自$mystr,包括多条新闻记录
$myarrline=array();  
$myarrline =explode("||%%||", $myarrnews[$i]);      //$myarrline 是其中的一条记录,包括多个字段
print_r($myarrline);                     //每个新闻各个字段的集合,例如:Array ( [0] => 10 [1] => 2166 [2] => 创新。。。
现在需要这样的一个json串,格式为:(暂时设定为每页显示5条)
{
    "ret": 0, 
    "data": {
        "newslist": [
            {
                "title": "第1条新闻标题", 
                "commentcount": 0, 
                "source": "来源", 
                "nid": 10, 
                "digest": "新闻简介", 
                "ptime": "2012-03-28 14:11:43"
            }, 
            {
                "title": "第2条新闻标题", 
                "commentcount": 0, 
                "source": "来源", 
                "nid": 9, 
                "digest": "新闻简介", 
                "ptime": "2012-03-28 13:12:56"
            }, 
            {
                "title": "第3条新闻标题", 
                "commentcount": 0, 
                "source": "来源", 
                "nid": 8, 
                "digest": "新闻简介", 
                "ptime": "2012-03-28 12:21:11"
            }, 
            {
                "title": "第4条新闻标题", 
                "commentcount": 0, 
                "source": "来源", 
                "nid": 7, 
                "digest": "新闻简介", 
                "ptime": "2012-03-28 11:21:00"
            }, 
            {
                "title": "第5条新闻标题", 
                "commentcount": 1, 
                "source": "来源", 
                "nid": 5, 
                "digest": "新闻简介", 
                "ptime": "2012-02-18 19:20:01"
            }
        ], 
        "totalnum": 5
    }, 
    "msg": "ok"
}
//----------------------------
php语法该如何书写呢?请大家帮忙,急用!


回复讨论(解决方案)

俺是php菜鸟,绝对菜的那种,请大家回帖时代码和步骤给的详细些!谢谢了

$mystr 是什么内容,你总要贴出原始数据是什么样吧。

[code=php]再详细点:
$weblink="http://www.xxx.net.cn/news/getnews.asp?cid=4&topnum=10";
 $mystr=file_get_contents($weblink);
 $myarrnews=array();
//拆分分条新闻条件成数组
$myarrnews =explode("||**||", $mystr);
//    print_r ($myarrnews);              //该分类ID下前10条数据的集合
 //拆分具体内容条件成数组    
 /*
    下面对采集的数据集合进行描述,就是说每条数据都包括以下的字段信息,而且这些信息已经获取到$myarrnews中了!
0:代表采集信息数量
1:信息原始ID号 (新闻分类ID号)
2:信息标题
3:信息类别
4:信息内容
5:是否首页图片
6:访问量
7:发布人
8:副标题
9:信息发布时间
 */
$obj->ret=0;
 $newslist=array("newslist"=>array());
for ($i=0;$i            $myarrline=array();  
           $myarrline =explode("||%%||", $myarrnews[$i]);      
           print_r($myarrline);                     //每个新闻各个字段的集合,例如:Array ( [0] => 10 [1] => 2166 [2] => 创新工会工作 创建模范职工之家 [3] => 学院新闻 [4] =>。。。。
例如:
 if ($myarrline[$i]!="") {   
              $newslist[$i]=>'title'=$myarrline[2];
              $newslist[$i]=>commentcount=0;
              $newslist[$i]=>source=$myarrline[7];
              $newslist[$i]=>nid=$myarrline[1];
              $newslist[$i]=>replycount=0;
              $newslist[$i]=>ptime=$myarrline[9];                  
          }
以下的格式不会写了(上面写的也不对)请大家帮忙补充

请给出真实的 url!
不知道原始信息如何讨论?

抱歉,安全原因,不能给出原始地址!
信息已经给的很详细了!不知道大侠还想要什么信息?
生成的json串只要类似即可

那你至少也得给出一条数据(哪怕是虚构的)
并指出与 json 成员的对应关系

其实大家如果阅读了#3楼的代码,看到这行:
  $newslist[$i]=>'title'=$myarrline[2];
大致就能猜出需求的格式了,而且我只要大概的语法格式,不必一一对应各个字段的(其实,有些字段还需要在改造!)。既然大家想看详细点的信息,我就再解释下。
//---------------------------------------------------------------------------------------------------
$weblink="http://www.xxx.net.cn/news/getnews.asp?cid=4&topnum=5";
 $mystr=file_get_contents($weblink);
 $myarrnews=array();
//拆分分条新闻条件成数组
$myarrnews =explode("||**||", $mystr);
//    print_r ($myarrnews);              //该分类ID下前5条数据的集合
 //拆分具体内容条件成数组 
//以上代码可以得到从asp网页中分类cid=4的新闻(如学院新闻)共5条记录
//--------------------------------------------------------------------------------------------------
//接下来的代码中,变量$myarrline为其中的一条新闻记录,该条新闻记录又包括了10个字段,已经获取到值了。其中第2个字段是新闻id号(即nid),[1] => 2166 ,(参考0#楼代码)。其中第3个字段是新闻标题,例如:[2] => 创新工会工作 创建模范职工之家,等等,我就不一一解释了。这条新闻是获取到的5条新闻中的第一条。大家明白了吧!?
           $myarrline=array();  
           $myarrline =explode("||%%||", $myarrnews[$i]);      
           print_r($myarrline);                     //每个新闻各个字段的集合,例如:Array ( [0] => 5 [1] => 2166 [2] => 创新工会工作 创建模范职工之家 [3] => 学院新闻 [4] =>。。。。
//--------------------------------------------------------------------
//最终需要转换重组成0#楼的json串,newslist是个数组,包含了5条记录,每条记录都要求显示出title。。。等6个字段。(其实大家不必考虑每个字段对应哪个$myarrline[i]的值,看到3#楼代码 $newslist[$i]=>'title'=$myarrline[2];就全明白了!大家哪怕只写出一个title,我照猫画虎就搞定了!ok?)
累死我了!

 $newslist[$i] = array(  'title' => $myarrline[2],  'commentcount' => 0,  'source' => $myarrline[7],  'nid' => $myarrline[1],  'replycount' => 0,  'ptime' => $myarrline[9],);


帮人还帮出毛病来了                  

首先感谢xuzuning斑竹的回复,不过我真的很菜,只给我这点代码我是搞不定的,我需要的是0#楼json串的完整代码,其中newlist数组中的5条记录用循环实现。
再次感谢!

$ar = arrat(  ' ret' => 0,   'data' => array(     'newslist' => $newslist,  ),);echo json_encode($ar);

$newslist 的产生 #8 已经示例了,你自己依葫芦画瓢吧

其实我本意是想这样:
//----------------------------------------
     $obj->ret=0;
         $newlist=array();
         $data=array("newslist"=>$newlist,"totalnum"=>5);    
         for ($i=0;$i            echo "-----------------";
           $myarrline=array();  
           $myarrline =explode("||%%||", $myarrnews[$i]);      
           print_r($myarrline);                     //每个新闻各个字段的集合,例如:Array ( [0] => 10 [1] => 2166 [2] => 创新工会工作 创建模范职工之家 [3] => 学院新闻 [4] =>
           if ($myarrnews[$i]!="") {
              //echo "No$i"; 
              $newsobj=new News();
              $newsobj->setTitle($myarrline[2]);
             // echo "========>".$newsobj->getTitle();
              $newsobj->setCommentcount(0);
              $newsobj->setSource($myarrline[7]);
              $newsobj->setNid($myarrline[1]);
              $newsobj->setReplycount(0);
              $newsobj->setPtime($myarrline[9]);             
             
              $newslist[$i]=>$newsobj;  //这里赋值有问题
         }
            else
           {
 echo "在当前年度内没有采集到数据!可能是本站没有最新数据信息!";
              return;
  }             
          }
         $obj->data=$data; 
                                                                                                                             /* echo "总量:".$myarrline[0]."
";
 echo "原始ID:".$myarrline[1]."
";
 echo "标题:".$myarrline[2]."
";
 echo "类别:".$myarrline[3]."
";
 //$bodyneirong=preg_replace(']*?)>','',myarrline[4]); 
                                                                                                                                 echo "内容:".$myarrline[4]."
";
 echo "图片:".$myarrline[5]."
";
 echo "访问量:".$myarrline[6]."
";
 echo "发布人:".$myarrline[7]."
";
 echo "副标题:".$myarrline[8]."
";
 echo "发布时间:".$myarrline[9]."
";
 echo "


";
 */ 
  $obj->msg ="ok";  
  print_r(json_encode($obj));
  $newslist=NULL;
  $obj=NULL; 
          ?>
//-----------------------------------
  $newslist[$i]=>$newsobj;  //但是这里赋值有问题!!
另外,虽然我总共只学了2个小时的php,我也知道
$obj->ret=0;

$obj = array(
是有区别的!

$data = array("newslist"=>$newlist,"totalnum"=>5);
显然应该放到for循环的后面赋值而不是前面。

不行啊,还是那一行提示有问题,移动代码也不行:
 $obj->ret=0;
         $newslist=array();
         $data=array("newslist"=>$newslist,"totalnum"=>5);      
         for ($i=0;$i            echo "-----------------";
   $myarrline=array();  
           $myarrline =explode("||%%||", $myarrnews[$i]);      
           print_r($myarrline);                     //每个新闻各个字段的集合,例如:Array ( [0] => 10 [1] => 2166 [2] => 创新工会工作 创建模范职工之家 [3] => 学院新闻 [4] =>
 if ($myarrnews[$i]!="") {
              echo "No$i"; 
              $newsobj=new News();
              $newsobj->setTitle($myarrline[2]);
              echo "========>".$newsobj->getTitle();   //此处可以取到title值
              $newsobj->setCommentcount(0);
              $newsobj->setSource($myarrline[7]);
              $newsobj->setNid($myarrline[1]);
              $newsobj->setReplycount(0);
              $newsobj->setPtime($myarrline[9]);             
             
              $newslist[$i]=>$newsobj;  //这里赋值有问题 ,提示Parse error: parse error in                
            }
            else
  {
    echo "在当前年度内没有采集到数据!可能是本站没有最新数据信息!";
              return;
  }             
          }

         $obj->data=$data; 
/* echo "总量:".$myarrline[0]."
";
 echo "原始ID:".$myarrline[1]."
";
 echo "标题:".$myarrline[2]."
";
 echo "类别:".$myarrline[3]."
";
 //$bodyneirong=preg_replace(']*?)>','',myarrline[4]); 
             echo "内容:".$myarrline[4]."
";
 echo "图片:".$myarrline[5]."
";
 echo "访问量:".$myarrline[6]."
";
 echo "发布人:".$myarrline[7]."
";
 echo "副标题:".$myarrline[8]."
";
 echo "发布时间:".$myarrline[9]."
";
 echo "


";
 */ 
  $obj->msg ="ok";  
  print_r(json_encode($obj));

  for ($i=0;$i            echo "-----------------";
   $myarrline=array();  
           $myarrline =explode("||%%||", $myarrnews[$i]);      
           print_r($myarrline);                     //每个新闻各个字段的集合,例如:Array ( [0] => 10 [1] => 2166 [2] => 创新工会工作 创建模范职工之家 [3] => 学院新闻 [4] =>
 if ($myarrnews[$i]!="") {
    
             $newslistarr=array('title' => $myarrline[2],   'commentcount' => 0,   'source' => $myarrline[7],   'nid' => $myarrline[1],   'replycount' => 0,   'ptime' => $myarrline[9], );                
                       $newslist[$i]=$newslistarr;
                       }
//--------------------------------------------
这样也不行,格式化后结果:{"ret":0,"data":{"newslist":[],"totalnum":5},"msg":"ok"} 数组是空的。
无奈了,php语法究竟怎么写呢?

$newslist[$i]   = $newsobj
你的多了个>

$newslist[$i]   = $newsobj
你的多了个>
是的,我这里写错了,不过改正之后,还是不行
格式化后结果:{"ret":0,"data":{"newslist":[],"totalnum":5},"msg":"ok"} 数组是空的。

我已经放弃使用对象了,php里对象转数组效率太低!

终于整出来了!是php二维数组的语法格式不会啊,绕了很多弯路。十分感谢ohmygirl的帮忙!
把代码贴出来,供大家参考下:
//---------------------------------------------------------------

<?php//数据库信息编码的设置header("Content-type: text/html; charset=utf-8");?> <?php/************************************************************** * *	使用特定function对数组中所有元素做处理 *	@param	string	&$array		要处理的字符串 *	@param	string	$function	要执行的函数 *	@return boolean	$apply_to_keys_also		是否也应用到key上 *	@access public * *************************************************************/function arrayRecursive(&$array, $function, $apply_to_keys_also = false){    static $recursive_counter = 0;    if (++$recursive_counter > 1000) {        die('possible deep recursion attack');    }    foreach ($array as $key => $value) {        if (is_array($value)) {            arrayRecursive($array[$key], $function, $apply_to_keys_also);        } else {            $array[$key] = $function($value);        }         if ($apply_to_keys_also && is_string($key)) {            $new_key = $function($key);            if ($new_key != $key) {                $array[$new_key] = $array[$key];                unset($array[$key]);            }        }    }    $recursive_counter--;} /************************************************************** * *	将数组转换为JSON字符串(兼容中文) *	@param	array	$array		要转换的数组 *	@return string		转换得到的json字符串 *	@access public * *************************************************************/function JSON($array) {	arrayRecursive($array, 'urlencode', true);	$json = json_encode($array);	return urldecode($json);}?><html>  <head>    <title>校园移动APP    </title>    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">  </head>  <body  leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">    <table  width="890"  border="0" cellpadding="4" cellspacing="3" align="left" style="font-size:13px">      <tr><td>          <hr>导航---【采集结果】2:          <br>          <br>          <br>          <br><?php		//信息采集地址,参数是默认采集当前年份下10条信息 系统限制到最大50条信息						 $weblink="http://newinfor.lnmec.net.cn/news/getnews.asp?lx=74&topnum=5";				// echo $weblink;				 $mystr=file_get_contents($weblink);//每次10条!				 $myarrnews=array();				 //拆分分条新闻条件成数组				 $myarrnews =explode("||**||", $mystr);			//	   print_r ($myarrnews);              //该分类ID下前10条数据的集合				 //拆分具体内容条件成数组    				 /*				    下面对采集的数据集合进行描述					0:代表采集信息数量					1:信息原始ID号 (新闻分类ID号)					2:信息标题					3:信息类别					4:信息内容					5:是否首页图片					6:访问量					7:发布人					8:副标题					9:信息发布时间				 */         $obj=array();				 $obj["ret"]=0;	                  $newslist=array();	 				          for ($i=0;$i<count($myarrnews);$i++){                       echo "-----------------";				   $myarrline=array();		            $myarrline =explode("||%%||", $myarrnews[$i]);                 print_r($myarrline);                     //每个新闻各个字段的集合,例如:Array ( [0] => 10 [1] => 2166 [2] => 创新工会工作 创建模范职工之家 [3] => 学院新闻 [4] =>					 if ($myarrnews[$i]!="") {             echo "No$i";               $newslist[$i]['title']=$myarrline[2] ;               $newslist[$i]['commentcount']=0 ;              $newslist[$i]['source']=$myarrline[7] ;              $newslist[$i]['nid']=$myarrline[1] ;              $newslist[$i]['replycount']=0;              $newslist[$i]['ptime']=$myarrline[9] ;              }            else					  {					    echo "在当前年度内没有采集到数据!可能是本站没有最新数据信息!"; 					  }                       }          $data=array("newslist"=>$newslist,"totalnum"=>5);           $obj["data"]=$data; 				  $obj["msg"] ="ok";  								  print_r(JSON($obj));           				  $newslist=NULL;				  $obj=NULL;           ?>          </td>      </tr>    </table>  </body></html>

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn