如何基于原始数组中的值将PHP多维数组转换为另一个数组?
我花了一周的时间来研究这个问题,我正试图找到一种方法来访问多维数组中的数据,并将其输出到另一个数组,根据数组中的值进行不同的重构。我没有发布一行又一行的错误代码,而是提供了我的简化示例: 以下是原始阵列:如何基于原始数组中的值将PHP多维数组转换为另一个数组?,php,arrays,object,multidimensional-array,output,Php,Arrays,Object,Multidimensional Array,Output,我花了一周的时间来研究这个问题,我正试图找到一种方法来访问多维数组中的数据,并将其输出到另一个数组,根据数组中的值进行不同的重构。我没有发布一行又一行的错误代码,而是提供了我的简化示例: 以下是原始阵列: array(2) { [0] => array(2) { ["aaa"] => array(2) { ["a19a3234b881ce"] => array(2) {
array(2) {
[0] => array(2) {
["aaa"] => array(2) {
["a19a3234b881ce"] => array(2) {
["pid"] => int(29301)
["vid"] => int(29334)
["idx"] => int(88888)
}
["a7aa94c38aa49caa"] => array(2) {
["pid"] => int(20568)
["vid"] => int(26547)
["idx"] => int(88888)
}
}
["bbb"] => array(2) {
["bsfn"] => string(4) "Apple"
["bsln"] => string(8) "AppleApple"
}
}
[1] => array(2) {
["aaa"] => array(3) {
["abd296a10"] => array(2) {
["pid"] => int(56734)
["vid"] => int(98612)
["idx"] => int(99999)
}
["a31e920fde8"] => array(2) {
["pid"] => int(09800)
["vid"] => int(34521)
["idx"] => int(99999)
}
["a7aa94c38aa49caa"] => array(2) {
["pid"] => int(20568)
["vid"] => int(26547)
["idx"] => int(99999)
}
}
["bbb"] => array(2) {
["bsfn"] => string(4) "Ball"
["bsln"] => string(8) "BallBall"
}
}
}
以下是我想要输出的内容:
array(2) {
["88888"] => array(3) {
["a19a3234b881ce"] => array(4) {
["pid"] => int(29301)
["vid"] => int(29334)
["idx"] => int(88888)
["arr"] => string(14) "a19a3234b881ce"
}
["a7aa94c38aa49caa"] => array(4) {
["pid"] => int(20568)
["vid"] => int(26547)
["idx"] => int(88888)
["arr"] => string(16) "a7aa94c38aa49caa"
}
["bbb"] => array(2) {
["bsfn"] => string(4) "Apple"
["bsln"] => string(8) "AppleApple"
}
}
["99999"] => array(4) {
["abd296a10"] => array(4) {
["pid"] => int(29301)
["vid"] => int(29334)
["idx"] => int(99999)
["arr"] => string(9) "abd296a10"
}
["a31e920fde8"] => array(4) {
["pid"] => int(20568)
["vid"] => int(26547)
["idx"] => int(99999)
["arr"] => string(11) "a31e920fde8"
}
["a7aa94c38aa49caa"] => array(4) {
["pid"] => int(20568)
["vid"] => int(26547)
["idx"] => int(99999)
["arr"] => string(16) "a7aa94c38aa49caa"
}
["bbb"] => array(2) {
["bsfn"] => string(4) "Ball"
["bsln"] => string(8) "BallBall"
}
}
}
试试这个例子:
$result = [];
foreach($data as $item) {
if (!empty($item['aaa']) && is_array($item['aaa'])) {
$key = array_values($item['aaa'])[0]['idx'] ?? null;
if ($key) {
$result[$key] = array_merge($item['aaa'], ['bbb' => $item['bbb'] ?? []]);
}
}
}
// Test result:
print_r($result);
#1:数组是如何生成的?你能控制它吗#2:您要重新写入的数组是否始终处于“aaa”?#1-我无法控制原始数组。它以序列化数组的形式出现,我将其取消序列化()#2是的,他们总是在[aaa]。[aaa]数组中的数组键是动态生成的,可以有任意数量的键。您会注意到,在所需的输出数组中,我需要按idx值排序的数据,并将该值分配给每个键。转换背后有什么规则吗?既然您已经编写了预期的输出,为什么不将其复制并粘贴到脚本中?@NicoHaase方法是获取原始数组数据,将其放入基于[idx]值构造的数组中。然后,我将创建一个foreach循环,查找每个idx键,并在页面和/或导出文件中显示每个键包含的数据。这正是我想要做的。非常感谢你付出努力帮助我度过难关。然而,基于你的例子,我确实做了一些修改。请参阅我的评论。我会尽快投票。我添加了cky值,并使用idx、cky和arr值创建了唯一的数组键。最终的输出并不完全是我最初希望得到的,但它会做我需要它做的事情。我使用以下命令更改数组键:$nkeys=substr($item['idx'],-4)。'-'。子项($item['arr],-4)。'-'。substr($item['cky'],-4);我的最终输出基于@user14717238示例代码。更正:我的最终输出受@user14717238示例代码的启发,而不是完全基于它since@user14717238的更像是我最初的输出请求,与我发布的答案有所不同。我很高兴能够提供帮助,您的问题已经解决。还有一点提示:$item['idx']是一个整数,如果您想将密钥长度保持在四个前导数字内,那么对于小于1000的值,可以使用零缩进-
substr(sprintf('%04d',$item['idx']),-4)
。
Final Output
array(5) {
["8888-81ce-4f15"] => array(5) {
["pid"] => int(29301)
["vid"] => int(29334)
["idx"] => int(88888)
["cky"] => string(8) "d9b04f15"
["arr"] => string(14) "a19a3234b881ce"
}
["8888-9caa-8ac0"] => array(5) {
["pid"] => int(20568)
["vid"] => int(26547)
["idx"] => int(88888)
["cky"] => string(8) "fa71c3f5f8ac0"
["arr"] => string(16) "a7aa94c38aa49caa"
}
["9999-6a10-dbb9"] => array(5) {
["pid"] => int(29301)
["vid"] => int(29334)
["idx"] => int(99999)
["cky"] => string(8) "e3fc1fdbb9"
["arr"] => string(9) "abd296a10"
}
["9999-fde8-f409"] => array(5) {
["pid"] => int(20568)
["vid"] => int(26547)
["idx"] => int(99999)
["cky"] => string(8) "88195c46f409"
["arr"] => string(11) "a31e920fde8"
}
["9999-9caa-8ac0"] => array(5) {
["pid"] => int(20568)
["vid"] => int(26547)
["idx"] => int(99999)
["cky"] => string(8) "fa71c3f5f8ac0"
["arr"] => string(16) "a7aa94c38aa49caa"
}
}
}