【问题标题】:Convert Two Associative Arrays into One Multidimensional Array PHP将两个关联数组转换为一个多维数组 PHP
【发布时间】:2020-04-20 09:12:06
【问题描述】:

我有 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"
    }
  ]
}

上面这2个数组是由这段代码生成的:

<?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();

?>

我需要在 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"
        }
      ]
    }
  ]
}

我如何实现这一目标?我一直在网上搜索,但似乎没有运气。 任何帮助将不胜感激。

谢谢。

【问题讨论】:

标签: php mysql json multidimensional-array


【解决方案1】:

您只需遍历$schedule 数组,将其值插入$competence 中,其中$competence 中的id 值与$schedule 中的parent_id 值匹配:

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

【讨论】:

  • 感谢您的回答。它有效,但@Jeto 的回答做得更好。感谢您的回答。
  • 不用担心 - 请注意,您可以在从 $querySchedule 获取的 while 循环中包含 if 块,这样您就不需要额外的 foreach 循环。
【解决方案2】:

我会在循环遍历它们时按 ID 索引权限,然后在循环遍历调度时简单地调整它的数组。

这样,你不需要循环任何东西两次:

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']];
  }
}

然后,如果您在json_encode-ing 返回时不需要/不希望将 ID 作为键,则可以使用 array_values

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

【讨论】:

  • 对不起,我好像遗漏了您的代码中的某些内容。如何将计划数组放入权限数组中?我看到的是能力和日程安排在两个不同的响应对象中。谢谢。
  • @ITDudes $competence[$row['id_competence']]['schedule'][] = $schedule[$row['id']]; 这一行将调度添加到匹配权限的'schedule' 子数组中。所以最后,$competence 数组应该是您所期望的。因此,如果您自己不需要时间表,只需编码/返回$response['competence']
  • 太棒了。它有效,调度数组现在在权限内。但是在能力数组内部创建了一个新的关联“id”对象,它使所有结果都在能力id而不是“能力”数组中。有什么办法解决这个问题吗?
  • @ITDudes 您是否按照答案末尾的建议使用了array_values
  • 它现在可以正常工作。我忘了使用你之前提到的array_values。非常感谢。
【解决方案3】:

我希望这会像魅力一样发挥作用。

    $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));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多