假设我们有一个数组,需要将其转换为行数
从这个。
Array
(
[subject] => Array
(
[0] => EDN:LOC:DERR
[1] => EDN:LOC:DOXX
[2] => EDN:LOC:NTTT
[3] => EDN:LOC:NAGA
)
[object] => Array
(
[0] => ABS:D01::ADFPAZ01
[1] => ABS:D01::DOXYWITX
[2] => ABS:D01::NAGBAAD2
[3] => ABS:D01::NAGGAAD2
)
[units] => Array
(
[0] => ABS:D06::UNAA
[1] => ABS:D06::UMMM
[2] => ABS:D06::UPOP
[3] => ABS:D06::UPOP
)
到这个
[0] => "'DERR' , 'ADFPAZ01' , 'UNAA'"
[1] => "'DOXX' , 'DOXYWITX' , 'UMMM'"
[2] => "'NTTT' , 'NAGBAAD2' , 'UPOP'"
[3] => "'NAGA' , 'NAGGAAD2' , 'UPOP'"
所以我需要用一个模式来清理数组,并将其压缩成行。
我用下面的函数来管理紧凑视图
$array_res = array();
for ($i=0; $i<=$totalEntries-1; $i++) {
array_push($array_res, implode("', '", array_column($array_of_arrays, $i)));
}
我的regex模式是 $pattern = '([^.:]*$)';
它从字符串的末尾收集字母序列,直到找到冒号。而我用了 preg_match($pattern, $string, $match)
来接收合适的字符串到$match变量中。
然而,我无法在for循环内将上述两个过程与array_filter或array_map结合起来。
EDIT: 请注意,可能有一个子数组包含的值没有冒号。在这种情况下,我们必须按原样取值。
[units] => Array
(
[0] => NULL
[1] => VALUE1
[2] => VALUE2
[3] => NULL
)
与其使用regex,不如直接使用 array_walk()
来处理提取出来的列,对于每一个项目,它都会使用 strrchr()
与 :
作为最后一个匹配的字符(尽管它将包括在最后一个字符中的 :
因此,使用 substr()
去掉第一个字符)...)
for ($i=0; $i<=$totalEntries-1; $i++) {
$newRow = array_column($array_of_arrays, $i);
array_walk($newRow, function (&$data) {
$data = substr(strrchr(":".$data, ":") , 1);
});
$array_res[] = "'".implode("', '", $newRow)."'";
}
该部分 ":".$data
处理的是在没有 :
字符串中,它将始终确保它能找到要使用的东西。
其他方式。
$arr = [
'subject' => [ 'EDN:LOC:DERR', 'EDN:LOC:DOXX', 'EDN:LOC:NTTT', 'EDN:LOC:NAGA' ],
'object' => [ 'ABS:D01::ADFPAZ01', 'ABS:D01::DOXYWITX', 'ABS:D01::NAGBAAD2', 'ABS:D01::NAGGAAD2' ],
'units' => [ 'ABS:D06::UNAA', 'ABS:D06::UMMM', 'ABS:D06::UPOP', 'ABS:D06::UPOP' ]
];
$res = [];
$fmt = "'%s', '%s', '%s'";
foreach ($arr['subject'] as $k => $v) {
$res[] = vsprintf($fmt, preg_replace('~^.*:~', '', array_column($arr, $k)));
}
print_r($res);
注意: 如果你事先不知道你的数组长度, 没有任何东西禁止你动态地建立格式模式(使用) str_repeat
或 implode
).