我有一个文本,我想通过排除将其转换为数组,但我无法获得真实的数组
# 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"
答案 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));
&
上的每个数组并将其解析为查询字符串的函数