Home >Backend Development >PHP Tutorial >求助:格式化这样的一个json串,语法该怎么写?()

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

WBOY
WBOYOriginal
2016-06-23 14:00:20997browse

例如有一个二维数组 
$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>

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn