0

假设我们有一个需要转换为行的数组

由此:

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
    )
4

2 回答 2

1

而不是使用正则表达式,这仅用于处理提取的列,并将其用作要匹配的最后一个字符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处理字符串中没有的时间:,它将始终确保它确实找到了可以使用的东西。

于 2020-05-13T09:22:53.837 回答
1

另一种方式:

$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_repeator implode)。

于 2020-05-13T11:01:27.400 回答