结合使用 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_repeatimplode)。