将文本排除到有效数组中

时间:2019-04-09 19:50:16

标签: php

我有一个文本,我想通过排除将其转换为数组,但我无法获得真实的数组

# SRC-ADDRESS DST-ADDRESS PACKETS BYTES SRC-USER DST-USER 0 10.40.47.48 216.58.205.211 12 822 2 1 10.40.47.48 102.132.97.21 66 9390 2 2 184.106.10.77 10.40.47.252 10 1819 1 3 10.40.47.252 104.27.155.225 1 41 1 4 10.40.47.252 144.76.103.6 5 878 1 5 102.132.97.35 10.40.47.252 11 1159 1 6 10.40.47.252 52.169.53.217 1 397 1 7 104.27.155.225 10.40.47.252 1 52 1 

我想要这样的结果

Array
(
    [0] => Array
        (
            [.id] => *0
            [src-address] => 10.40.47.50
            [dst-address] => 185.144.157.141
            [packets] => 6
            [bytes] => 1349
        )
    [1] => Array
        (
            [.id] => *1
            [src-address] => 195.122.177.151
            [dst-address] => 10.40.47.48
            [packets] => 4
            [bytes] => 174
            [dst-user] => 2
        )
....

我尝试这样做,但这是错误的     $ arr = exclude(“”,$ text);

编辑:

我可以通过其他方式获取文字

 0 src-address=108.177.15.188 dst-address=10.40.47.252 packets=1 bytes=52 dst-user="1" 1 src-address=10.40.47.48 dst-address=172.217.19.150 packets=11 bytes=789 src-user="2" 2 src-address=184.106.10.77 dst-address=10.40.47.252 packets=26 bytes=5450 dst-user="1"

4 个答案:

答案 0 :(得分:0)

尝试使用str_getcsv读取分隔符,并用分隔符替换任何分隔符。

var_dump(str_getcsv($input, ","));

请注意,手册指出分隔符必须为一个字符长。如果需要选项卡或多个空格,则需要调查答案: str_getcsv on a tab-separated file

str-getcsv php手册

答案 1 :(得分:0)

这是可行的方法,但是我建议使用csv方法代替读取中的数据。尚不清楚您的数据应如何实际映射到标头。

$header = "# SRC-ADDRESS DST-ADDRESS PACKETS BYTES SRC-USER DST-USER ";
$input = "# SRC-ADDRESS DST-ADDRESS PACKETS BYTES SRC-USER DST-USER 0 10.40.47.48 216.58.205.211 12 822 2 1 10.40.47.48 102.132.97.21 66 9390 2 2 184.106.10.77 10.40.47.252 10 1819 1 3 10.40.47.252 104.27.155.225 1 41 1 4 10.40.47.252 144.76.103.6 5 878 1 5 102.132.97.35 10.40.47.252 11 1159 1 6 10.40.47.252 52.169.53.217 1 397 1 7 104.27.155.225 10.40.47.252 1 52 1 ";
$string = str_replace($header, "", $input );
$delimiter  = " ";
$columns = 6;


$splitData = explode($delimiter, $string);

$result = [];
$i= 0;
foreach ($splitData as $key => $value) {
     $result[$i][] = $value;
    if (($key+1) % $columns == 0 ){
        $i++;
    }

}

var_dump($result);

答案 2 :(得分:0)

正如我在评论中提到的那样,一种方法是先用“”(空格)explode DEMO输入。您遍历结果数组的每个元素/行。然后,用=(等号)将每个 炸开。如果 that 爆炸的结果是一个单元素数组,那么您应该知道应该开始一个新行并使用特殊的.id键创建一个键值对。如果结果的计数为2,则将第一部分作为当前行中新键值对的键,将第二部分作为该键值对的值。

某些源值被引用,但您似乎希望在结果中不引用它们,这有点折衷。为了解决这个问题,我们对值进行丢失相等检查,以查看该值是否转换为整数是否相同。如果是这样,则我们将其转换为删除引号。

$inputText = '0 src-address=108.177.15.188 dst-address=10.40.47.252 packets=1 bytes=52 dst-user="1" 1 src-address=10.40.47.48 dst-address=172.217.19.150 packets=11 bytes=789 src-user="2" 2 src-address=184.106.10.77 dst-address=10.40.47.252 packets=26 bytes=5450 dst-user="1"';

$result = array();

$spaceParts = explode(" ", $inputText);

foreach($spaceParts as $part)
{
    $subParts = explode("=", $part);

    if(count($subParts) == 1)
    {
        $resultIndex = (isset($resultIndex) ? $resultIndex+1 : 0);
        $result[$resultIndex] = array(".id" => "*".$part);
    }
    else if(count($subParts) == 2)
    {
        $result[$resultIndex][$subParts[0]] = ((int)$subParts[1] == $subParts[1] ? (int)$subParts[1] : $subParts[1]);
    }
    else
    {
        // unexpected, handle however you want
    }
}

print_r($result);

{{3}}

答案 3 :(得分:0)

使用0 src-address=108.177.15.188 dst-address=10.40.47.252 packets=1 bytes=52 dst-user="1"格式的第二个示例,有6个条目:

$result = array_map(function($v) {
                       parse_str("id=".implode("&", $v), $output);
                       return $output;
                    }, array_chunk(explode(' ', $text), 6));
  • 分解空间上的数组
  • 将数组分为每个元素6个条目
  • 映射到嵌入&上的每个数组并将其解析为查询字符串的函数