Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
循环遍历php中对象的json数组_Php_Arrays_Json_Loops - Fatal编程技术网

循环遍历php中对象的json数组

循环遍历php中对象的json数组,php,arrays,json,loops,Php,Arrays,Json,Loops,我有一个json对象数组 我想循环显示所有的父母和他们的孩子 [ { "ProfessionName": "Technique ", "ParentProfessionNum": "", "ParentProfession": null, "Id": 1, "RowVersion": null, "RowRevision": null }, { "Profess

我有一个json对象数组 我想循环显示所有的父母和他们的孩子

[
    {
        "ProfessionName": "Technique ",
        "ParentProfessionNum": "",
        "ParentProfession": null,
        "Id": 1,
        "RowVersion": null,
        "RowRevision": null
    },
    {
        "ProfessionName": "Production ",
        "ParentProfessionNum": "1",
        "ParentProfession": null,
        "Id": 2,
        "RowVersion": null,
        "RowRevision": null
    },
    {
        "ProfessionName": "Maintenance ",
        "ParentProfessionNum": "1",
        "ParentProfession": null,
        "Id": 3,
        "RowVersion": null,
        "RowRevision": null
    },
    {
        "ProfessionName": "Maintenance Unit Manager",
        "ParentProfessionNum": "3",
        "ParentProfession": null,
        "Id": 4,
        "RowVersion": null,
        "RowRevision": null
    },
    {
        "ProfessionName": "Maintenance operator",
        "ParentProfessionNum": "3",
        "ParentProfession": null,
        "Id": 5,
        "RowVersion": null,
        "RowRevision": null
    },
    {
        "ProfessionName": "Liquid maintenance operator",
        "ParentProfessionNum": "3",
        "ParentProfession": null,
        "Id": 6,
        "RowVersion": null,
        "RowRevision": null
    },
    {
        "ProfessionName": "Production Unit Manager",
        "ParentProfessionNum": "2",
        "ParentProfession": null,
        "Id": 7,
        "RowVersion": null,
        "RowRevision": null
    },
    {
        "ProfessionName": "project manager",
        "ParentProfessionNum": "2",
        "ParentProfession": null,
        "Id": 8,
        "RowVersion": null,
        "RowRevision": null
    },
    {
        "ProfessionName": "Machine operator",
        "ParentProfessionNum": "2",
        "ParentProfession": null,
        "Id": 9,
        "RowVersion": null,
        "RowRevision": null
    }
]
我确实是这样做的 首先,我将父级和子级拆分为单独的数组 如果为parent,则ParentProfessionNum必须为null 如果是子数组,则应该具有另一个数组的ID

$parents = array();
$childs = array();
foreach ($data as $job) {
     if (!$job['ParentProfessionNum']) {
       array_push($parents, $job);
     } else {
       array_push($childs, $job);
       }
     };
然后我用foreach做了一个循环

foreach ($parents as $p) {
   echo $p['ProfessionName'];
   $parent_id = $p['Id'];
   foreach ($childs as $c) {
       if ((int) $c['ParentProfessionNum'] == $parent_id) {
          echo $c['ProfessionName'];
       }
   }
}
但这只显示第一父母的孩子

更新 这是输出 技术(家长) 制作(儿童) 赡养费(儿童)

但这些孩子也是另一个孩子的父母
我想将它们全部显示为树状视图或任何其他方式

您从未设置过
$parent\u id
。。。使用
$p['id']
或设置
$parent\u id=$p['id']

另外,
(int)
强制转换在您使用
=
之前是无用的,因为PHP将检查值的相等性而不是类型,因此
1==“1”
为true,而
1==“1”
为false,因此需要强制转换

所以代码应该是

foreach($p数据){
回显“父项:”.$p->ProfessionName.\n”;
$parent_id=$p->id;
回显“子项:\n”;
foreach($c数据){
如果($c->ParentProfessionNum==$parent\u id){
echo$c->ProfessionName.“\n”;
}
}
回音“\n”;
}

您从未设置过
$parent\u id
。。。使用
$p['id']
或设置
$parent\u id=$p['id']

另外,
(int)
强制转换在您使用
=
之前是无用的,因为PHP将检查值的相等性而不是类型,因此
1==“1”
为true,而
1==“1”
为false,因此需要强制转换

所以代码应该是

foreach($p数据){
回显“父项:”.$p->ProfessionName.\n”;
$parent_id=$p->id;
回显“子项:\n”;
foreach($c数据){
如果($c->ParentProfessionNum==$parent\u id){
echo$c->ProfessionName.“\n”;
}
}
回音“\n”;
}
循环的子循环内部

替换来自的if语句的条件

if ((int) $c['ParentProfessionNum'] == $parent_id) {

分析数组后,如果具有
ProfessionName
的对象“生产”和“维护”也是父对象 然后您应该将
“ParentProfessionNum”
设置为空或null

"ParentProfessionNum" = ""
而不是

"ParentProfessionNum" = "1"
更新(基于问题更新)
当某个对象同时是子对象和父对象时

您需要更多属性(比如说
是\u parent
是\u child
),然后使用这些属性将child和parent分开,这样一些对象将同时位于parent和child数组上

foreach ($data as $job) {
  if ($job['is_parent']) {
    array_push($parents, $job);
  } 
  if ($job['is_child']) {
    array_push($childs, $job);
  }
};
循环的内部子循环

替换来自的if语句的条件

if ((int) $c['ParentProfessionNum'] == $parent_id) {

分析数组后,如果具有
ProfessionName
的对象“生产”和“维护”也是父对象 然后您应该将
“ParentProfessionNum”
设置为空或null

"ParentProfessionNum" = ""
而不是

"ParentProfessionNum" = "1"
更新(基于问题更新)
当某个对象同时是子对象和父对象时

您需要更多属性(比如说
是\u parent
是\u child
),然后使用这些属性将child和parent分开,这样一些对象将同时位于parent和child数组上

foreach ($data as $job) {
  if ($job['is_parent']) {
    array_push($parents, $job);
  } 
  if ($job['is_child']) {
    array_push($childs, $job);
  }
};

这看起来像是一个逻辑问题

第一步应该是找到所有的父母。 然后在父数组中循环并打印该父数组的所有子元素 所以


这看起来像是一个逻辑问题

第一步应该是找到所有的父母。 然后在父数组中循环并打印该父数组的所有子元素 所以



您缺少[在开始时?问题已更新]啊,好的,我可以使用其他代码吗,或者我应该继续使用您的代码吗?您缺少了[开始时?问题更新了啊,好的,我可以使用其他代码还是应该继续使用你的代码?我使用了,但问题是我需要循环并显示每个父项的所有子项。因此,如果您设置以下条件,例如
(int)$c['ParentProfessionNum']=$p['id']
输出显示第一个父项及其子项技术(父项)生产(子)维护(子)但是生产和维护也是父级的,并且有子级我需要保留循环并显示所有子级,但是根据您在分离子级和父级时设置的条件
(!$job['ParentProfessionNum')
只会将一个项推送到父项中,因为它只有空的
ParentProfessionNum
我这样做了,但问题是我需要循环并显示每个父项的所有子项。因此,如果您将以下条件设置为
(int)$c['ParentProfessionNum']=$p['id']
输出显示第一个父项及其子项(父项)生产(子项)维护(子项)但生产和维护也是父项且有子项我需要保留循环并显示所有子项,但根据您在分离子项和父项时设置的条件
(!$job['ParentProfessionNum']))
将只将一个项推入父项,因为它只有空的
ParentProfessionNum
是的,但输出仅显示第一个父项只有一个父项…只有一个元素将“”作为ParentProfessionNum,因此只有一个父项,脚本显示此父项的所有子项“技术生产维护”选中“维护操作员”它是维护的子项,因此维护是子项,也是父项是,但您只向$parents添加没有ParentProfessionNum值的项。检查此解决方案是否满足您的需要(编辑了Answare)是的,它可以工作,但输出仅显示第一个父项只有一个父项…只有一个元素具有“”作为ParentProfessionNum,因此只有一个父项,并且脚本显示此父项的所有子项“技术生产维护”检查维护操作符“这是抚养费的孩子,所以抚养费既是孩子也是父母是的,但你只在$parents中添加了