简体   繁体   English

将两个关联数组转换为一个多维数组 PHP

[英]Convert Two Associative Arrays into One Multidimensional Array PHP

I have 2 associative arrays resulting from 2 queries in JSON format below:我有 2 个关联数组,由以下 JSON 格式的 2 个查询生成:

{
  "competence": [
    {
      "id": "21",
      "title": "blabla",
      "description": "blabla",
      "image": "blabla"
    },
    {
      "id": "11",
      "title": "blabla",
      "description": "blabla",
      "image": "blabla"
    },
    {
      "id": "26",
      "title": "blabla",
      "description": "blabla",
      "image": "blabla"
    }
  ],
  "schedule": [
    {
      "id": "34",
      "parent_id": "21",
      "title": "blabla",
      "description": "blabla",
      "image": "blabla"
    },
    {
      "id": "33",
      "parent_id": "21",
      "title": "blabla",
      "description": "blabla",
      "image": "blabla"
    },
    {
      "id": "32",
      "parent_id": "11",
      "title": "blabla",
      "description": "blabla",
      "image": "blabla"
    },
    {
      "id": "31",
      "parent_id": "26",
      "title": "blabla",
      "description": "blabla",
      "image": "blabla"
    }
  ]
}

These 2 arrays above generated by this code:上面这两个数组由这段代码生成:

<?php

$queryCompetence = mysqli_query($con, "SELECT `id`, `title`, `description`, `image` FROM `competence` ORDER BY `title` ASC");
$querySchedule = mysqli_query($con, "SELECT `id`, `id_competence`, `title`, `description`, `image` FROM `schedule` ORDER BY `created_date` DESC");

$competence = array();
$schedule = array();

while ($row = mysqli_fetch_assoc($queryCompetence)) {
    $competence[] = array(
        'id' => $row['id'],
        'title' => $row['title'],
        'description' => $row['description'],
        'image' => $row['image'],
    );
}

while ($row = mysqli_fetch_assoc($querySchedule)) {
    $schedule[] = array(
        'id' => $row['id'],
        'parent_id' => $row['id_competence'],
        'title' => $row['title'],
        'description' => $row['description'],
        'image' => $row['image'],
    );
}

$response['competence'] = $competence;
$response['schedule'] = $schedule;

echo json_encode($response);
die();

?>

I need to make a multidimensional array in php that will output the JSON below:我需要在 php 中创建一个多维数组,它将输出下面的 JSON:

{
  "competence": [
    {
      "id": "21",
      "title": "blabla",
      "description": "blabla",
      "image": "blabla",
      "schedule": [
        {
          "id": "34",
          "parent_id": "21",
          "title": "blabla",
          "description": "blabla",
          "image": "blabla"
        },
        {
          "id": "33",
          "parent_id": "21",
          "title": "blabla",
          "description": "blabla",
          "image": "blabla"
        }
      ]
    },
    {
      "id": "11",
      "title": "blabla",
      "description": "blabla",
      "image": "blabla",
      "schedule": [
        {
          "id": "32",
          "parent_id": "11",
          "title": "blabla",
          "description": "blabla",
          "image": "blabla"
        },
        {
          "id": "33",
          "parent_id": "21",
          "title": "blabla",
          "description": "blabla",
          "image": "blabla"
        }
      ]
    },
    {
      "id": "26",
      "title": "blabla",
      "description": "blabla",
      "image": "blabla",
      "schedule": [
        {
          "id": "31",
          "parent_id": "26",
          "title": "blabla",
          "description": "blabla",
          "image": "blabla"
        }
      ]
    }
  ]
}

How do I achieve this?我如何实现这一目标? I've been searching around on the net but seems like getting no luck.我一直在网上搜索,但似乎没有运气。 Any help will be much appreciated.任何帮助都感激不尽。

Thank you.谢谢你。

You just need to iterate over the $schedule array, inserting its values into $competence where the id value in $competence matches the parent_id value in $schedule :你只需要遍历$schedule阵列,将其值代入$competence ,其中id$competence的匹配parent_id价值$schedule

foreach ($schedule as $s) {
    // find the parent_id in $competence
    if (($key = array_search($s['parent_id'], array_column($competence, 'id'))) !== false) {
        $competence[$key]['schedule'][] = $s;
    }
}
$response = array('competence' => $competence);

Demo on 3v4l.org 3v4l.org 上的演示

I would index the competences by ID when looping over them, then simply adjust its array when looping over the schedules.我会在循环时通过 ID 索引能力,然后在循环时简单地调整它的数组。

This way, you don't need to loop over anything twice:这样,您无需将任何内容循环两次:

while ($row = mysqli_fetch_assoc($queryCompetence)) {
  // `$competence` is now indexed by ID
  $competence[$row['id']] = [
    'id' => $row['id'],
    'title' => $row['title'],
    'description' => $row['description'],
    'image' => $row['image'],
  ];
}

while ($row = mysqli_fetch_assoc($querySchedule)) {
  $schedule[$row['id']] = [
    'id' => $row['id'],
    'parent_id' => $row['id_competence'],
    'title' => $row['title'],
    'description' => $row['description'],
    'image' => $row['image'],
  ];
  // If the parent competence exists, add the schedule to it
  if (array_key_exists($row['id_competence'], $competence)) {
    $competence[$row['id_competence']]['schedule'][] = $schedule[$row['id']];
  }
}

Then, if you don't need/want the IDs as keys when json_encode -ing back, you can use array_values :然后,如果在json_encode返回时不需要/想要 ID 作为键,则可以使用array_values

$response['competence'] = array_values($competence);
$response['schedule'] = array_values($schedule);

I hope this will work like charm.我希望这会像魅力一样发挥作用。

    $a = [
    [
          "id"=> "21",
          "title"=> "blabla",
          "description"=> "blabla",
          "image"=> "blabla"
        ],
        [
          "id"=> "11",
          "title"=> "blabla",
          "description"=> "blabla",
          "image"=> "blabla"
        ],
        [
          "id"=> "26",
          "title"=> "blabla",
          "description"=> "blabla",
          "image"=> "blabla"
        ]
    ];

    $b = [
        [ "id"=> "34",
          "parent_id"=> "21",
          "title"=> "blabla",
          "description"=> "blabla",
          "image"=> "blabla"
        ],
        [
          "id"=> "33",
          "parent_id"=> "21",
          "title"=> "blabla",
          "description"=> "blabla",
          "image"=> "blabla"
        ],
        [
          "id"=> "32",
          "parent_id"=> "11",
          "title"=> "blabla",
          "description"=> "blabla",
          "image"=> "blabla"
        ],
       [
          "id"=> "31",
          "parent_id"=> "26",
          "title"=> "blabla",
          "description"=> "blabla",
          "image"=> "blabla"
        ]
    ];


    $final = [];

    foreach($a as $key => $val)
    {
        $final[$key] = $val;
        foreach($b as $key1 => $val1)
        {

            if($val['id'] == $val1['parent_id'])
            {
                $final[$key]['schedule'][$key1] = $val1;
            }
        }
    }

$t = [];
$t['competence'] = $final;
echo "<pre>";
print_r(json_encode($t));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM