gpt4 book ai didi

php - 使用 php 对 GROUP_CONCAT() 中的序列化数据进行排序

转载 作者:行者123 更新时间:2023-11-29 16:25:29 29 4
gpt4 key购买 nike

我有一个包含这些列的表格:

contest_id, exhibition_id, username, files

files包含我在放入数据库时​​序列化的图片,因为它们是多个文件。files 列如下所示

"a:3:{i:0;s:9:"10210.PNG";i:1;s:9:"99073.PNG";i:2;s:9:"89321.PNG";}"

我使用 PHP 执行了此 SQL 语句

$a = mysqli_query($this->con, "SELECT username,  GROUP_CONCAT(files) files from my_exhibition_contests WHERE exhibition_id='$id'");

并继续用 PHP 编写此内容

$s=$a->fetch_all(MYSQLI_ASSOC); 
foreach ($s as &$row) {
$row['files'] = unserialize($row['files']);
}
echo json_encode($s);

然后我在前端用angularjs采集了。我使用了 GROUP_CONCAT(files) 以便按用户名对其进行分组,并将具有该用户名的所有文件放在一行中。问题是使用 foreach ($s as &$row) 违背了 GROUP_CONCAT(files) 的目的,它只带来了结果之一,就像我使用 >GROUP BY,但是在删除 foreach ($s as &$row) 时,它按照我想要的方式工作(即,它将具有该特定用户名的文件中的所有行打包在一个别名为 files 的单列),但每个文件索引中的值均以字符串格式序列化。如何反序列化文件数组中的每个索引。让我举个例子,假设表格中的第一行是这样的

contest_id: 1 exhibition_id: 5 username: John files: "a:3:{i:0;s:9:"10210.PNG";i:1;s:9:"99073.PNG";i:2;s:9:"89321.PNG";}"

第二行是这样的

contest_id: 2 exhibition_id: 5 username John: files: "a:3:{i:0;s:9:"33937.PNG";i:1;s:9:"26831.PNG";i:2;s:8:"6316.PNG";}"

当我删除 foreach 时,我得到了这个

username: John files: "a:3:{i:0;s:9:"10210.PNG";i:1;s:9:"99073.PNG";i:2;s:9:"89321.PNG";},a:3:{i:0;s:9:"33937.PNG";i:1;s:9:"26831.PNG";i:2;s:8:"6316.PNG";}"

它将所有内容放入单列文件中,这正是我想要的,但问题是它以字符串格式序列化。

当我输入 foreach 行时,我得到了这个

username: John files : ["10210.PNG", "99073.PNG", "89321.PNG"]

这是数组格式,正是我想要的,但它只带来了第一行,我该如何处理才能使其采用数组格式,但又带来所有行?

最佳答案

您的问题是,您需要在反序列化之前GROUP_CONCAT'ed文件列表分开,然后合并所有结果。这应该有效:

$s=$a->fetch_all(MYSQLI_ASSOC);
foreach ($s as &$row) {
$files = array();
foreach (preg_split('/}(,|$)/', $row['files'], -1, PREG_SPLIT_NO_EMPTY) as $filelist) {
$files = array_merge($files, unserialize($filelist . '}'));
}
$row['files'] = $files;
}
echo json_encode($s);

Demo of splitting code on 3v4l.org

注意

我们必须使用preg_split分割数据,因为序列化数据中也有逗号。如果您更改查询以使用不同的分隔符,该分隔符不会出现在文件名之一中,例如

$a = mysqli_query($this->con, "SELECT username,  GROUP_CONCAT(files SEPARATOR '#') files from my_exhibition_contests WHERE exhibition_id='$id'");

那么你可以将 preg_split 替换为

explode('#', $row['files'])

这也将消除在反序列化之前将 } 分割字符添加回 $filelist 的需要。

关于php - 使用 php 对 GROUP_CONCAT() 中的序列化数据进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54272501/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com