合并PHP多维数组中每个实体的SQL查询结果

Merge SQL query result for each entity in PHP multi-dimensional array

提问人:Zarian71 提问时间:12/5/2022 最后编辑:Zarian71 更新时间:12/6/2022 访问量:117

问:

首先,我得到我的SQL查询结果,我把它放在一个数组中,如下所示:

$stmt= $conn->prepare("SELECT p.*, f.*
                        FROM fruit f
                        left JOIN person p ON f.fk_p_id = p.p_id
                        ");
$stmt->execute();
$result= $stmt->get_result();
while ($data= $result->fetch_assoc()) {
   $arr = array('name' => $data['name'], 'fruit' =>data['fruit']);
   $props[] = $arr;
}

var_export($props);

我明白了:

array ( 0 => array (name => CHRISTIAN fruit => apple, ),
1 => array ( name => CHRISTIAN, fruit => pear, ),
2 => array ( name => CHRISTIAN, fruit  => strawberry, ),
3 => array ( name => CHRISTIAN, fruit => banana, ),
4 => array ( name => CHRISTIAN, fruit => lime, ),
5 => array ( name => JOSEF, fruit => apple, ),
6 => array ( name => JOSEF, fruit => pear, ),
7 => array ( name => BOB, fruit => apple , ),
8 => array ( name => BOB, fruit => banana, ),)

但是我希望我的数组像这样合并:

array ( 0 => name => CHRISTIAN, fruit => apple , pear, strawberry, banana, lime, ),
1 =>name => JOSEF, fruit => apple, pear, ),
2 =>name => BOB, fruit => apple, banana, ), ) 

目的是填充这样的表格:

苹果 草莓 香蕉 石灰
基督教 x x x x x
约瑟夫 x x
鲍勃 x x

我应该怎么做才能用多元数组得到这个结果?谢谢

php sql 数组 mysqli

评论

1赞 Dharman 12/5/2022
这个循环的目的是什么?while
0赞 Dharman 12/5/2022
你能使用 PDO 吗?使用 PDO,它会容易得多。你使用mysqli有什么原因吗?
0赞 Dharman 12/5/2022
最好显示输出而不是自定义输出,这非常具有误导性。var_export
0赞 mickmackusa 12/6/2022
@Zar这个答案似乎很相关

答:

3赞 abraham27 12/5/2022 #1

我的假设是你需要一个数组。

如果您尝试以下操作... 创建一个数组并循环访问查询结果。 然后使用 data['name'] 作为键,并将不同的水果作为数组添加到水果键中。

$arr = [];
while ($data= $result->fetch_assoc()) {
   $arr[$data['name']]['fruit'][] = $data['fruit'];
}

输出如下所示:

Array
(
    [CHRISTIAN] => Array
        (
            [fruit] => Array
                (
                    [0] => apple
                    [1] => pear
                    [2] => strawberry
                    [3] => banana
                    [4] => lime
                )

        )

    [JOSEF] => Array
        (
            [fruit] => Array
                (
                    [0] => apple
                    [1] => pear
                )

        )

    [BOB] => Array
        (
            [fruit] => Array
                (
                    [0] => apple
                    [1] => banana
                )

        )

)

对于该表,您可以尝试如下操作:

<table>
    <tr>
        <th></th>
        <th>Apple</th>
        <th>Pear</th>
        <th>Stawberry</th>
        <th>Banana</th>
        <th>Lime</th>
    </tr>
<?php foreach ($arr as $name => $value) { ?>
    <tr>
        <td><?php echo $name ?></td>
        <td><?php if (in_array('apple', $value['fruit'])) { echo "X"; } ?></td>
        <td><?php if (in_array('pear', $value['fruit'])) { echo "X"; } ?></td>
        <td><?php if (in_array('strawberry', $value['fruit'])) { echo "X"; } ?></td>
        <td><?php if (in_array('banana', $value['fruit'])) { echo "X"; } ?></td>
        <td><?php if (in_array('lime', $value['fruit'])) { echo "X"; } ?></td>
    </tr>
<?php } ?>
</table>

评论

0赞 Zarian71 12/5/2022
谢谢,你知道创建我在问题中制作的表格的方法吗?
0赞 mickmackusa 12/6/2022 #2

在我看来,你可以从“动态支点”中受益——如果你不知道到底会吃到什么果实。当涉及到动态透视时,MySQL不是一个优雅的工具(我上次检查过)。

我会按名称对行进行分组,并填充指向空字符串的水果名称的关联数组,以便您可以填充表标题并将这些空字符串用作默认值。

您不仅不需要在循环中调用,还可以“解构”结果对象有效负载,就好像它是关联数组一样。fetch()

代码:(演示)

$defaults = [];
$grouped = [];
foreach ($stmt->get_result() as ['name' => $name, 'fruit' => $fruit]) {
    $grouped[$name][$fruit] = 'x';
    $defaults[$fruit] = '';
}


$table = <<<HTML
<table border=1>
    <tr><th>%s</th></tr>%s
</table>
HTML;

$tableRow = <<<HTML

    <tr><td>%s</td></tr>
HTML;

printf(
    $table,
    implode('</th><th>', array_merge([''], array_keys($defaults))),
    implode(
        array_map(
            fn($name, $row) => sprintf($tableRow, implode('</td><td>', array_merge([$name], $defaults, $row))),
            array_keys($grouped),
            $grouped
        )
    )
);

打印 HTML 有点笨拙,因为名称列/数据必须附加到标题行和所有表正文行之前。

单击演示链接上的眼睛图标以查看呈现的 HTML 输出。