将array_column与preg_match结合使用。

问题描述 投票:0回答:1

假设我们有一个数组,需要将其转换为行数

从这个。

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
    )
php multidimensional-array mapreduce preg-match array-column
1个回答
1
投票

与其使用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 处理的是在没有 : 字符串中,它将始终确保它能找到要使用的东西。


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_repeatimplode).

© www.soinside.com 2019 - 2024. All rights reserved.