结合使用 array_column 和 preg_match
Use array_column in combination with preg_match
假设我们有一个需要转换为行的数组
来自这里:
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)));
}
我的正则表达式模式是 $pattern = '([^.:]*$)';
它从字符串末尾收集一系列字母,直到找到冒号。我使用 preg_match($pattern, $string, $match)
将正确的字符串接收到 $match 变量中。
但是,我无法将上述两个过程与 for 循环中的 array_filter 或 array_map 结合起来。
编辑:请注意,可以有一个包含不带冒号的值的子数组。在那种情况下,我们必须按原样获取值
[units] => Array
(
[0] => NULL
[1] => VALUE1
[2] => VALUE2
[3] => NULL
)
而不是使用正则表达式,这只是使用 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
)。
假设我们有一个需要转换为行的数组
来自这里:
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)));
}
我的正则表达式模式是 $pattern = '([^.:]*$)';
它从字符串末尾收集一系列字母,直到找到冒号。我使用 preg_match($pattern, $string, $match)
将正确的字符串接收到 $match 变量中。
但是,我无法将上述两个过程与 for 循环中的 array_filter 或 array_map 结合起来。
编辑:请注意,可以有一个包含不带冒号的值的子数组。在那种情况下,我们必须按原样获取值
[units] => Array
(
[0] => NULL
[1] => VALUE1
[2] => VALUE2
[3] => NULL
)
而不是使用正则表达式,这只是使用 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
)。