转动 |将文件分隔成 PHP 中的关联数组

turning a | seperated file into an associative array in PHP

我正在尝试把一个基本的 |单独的文件,看起来像这样:

10.10.0.139|1623778800.0631|20210615 13:40:00|783||test.php|||用户登录结束|0.2406407635352 10.10.0.139|1623778800.0631|20210615 13:40:00|783||test.php|||用户登录结束|0.34064078330994 10.10.0.139|1623778800.0631|20210615 13:40:00|783||test.php||index.php|用户通话结束|0.50612878799438

变成这样的东西:

[0] => Array
(
  [test.php|||end of user login] => 0.2406407635352
)
[1] => Array
(
  [test.php|||end of user login] => 0.34064078330994
)
[2] => Array
(
  [test.php||index.php|end of User call] => 0.50612878799438
)

这样我就可以 运行 通过文件并获取密钥、计数、最小值、最大值和平均值。 到目前为止,我的代码如下所示:

<?php

   $arrayContent = file("test.txt");
   $returnArray = array();
   $i = 0;

   foreach($arrayContent as $row){
     // echo $row;
     $returnArray[$i++] = explode("|", $row);
   }
   $contentArray = array();

   foreach($returnArray as $row) {
     $key = $row[5] . '|' . $row[6] . '|' . $row[7] . '|' . $row[8];
     $time = $row[9];
     $contentArray[$key] = $time;
   }
   
    ksort($contentArray);

?>

当我 print_r($contentArray) 我会得到这个:

Array
(
    [soap.php|||end of User call] => 0.50612878799438
    [soap.php|||end of user login] => 0.34064078330994

)

它似乎采用了用户登录结束的最后一个值,并且没有三行 - 2 表示 [soap.php|||用户登录结束],1 表示 [soap.php|||用户通话结束]

我的最终目标是将输出转换为如下所示的文本文件:

Key Count Min Max Avg 
[soap.php|||end of user login], 2, 0.2406407635352, 0.34064078330994, 0.29064077342257
[soap.php|||end of User call], 1, 0.50612878799438, 0.50612878799438, 0.50612878799438

您的代码将键的值设置为在文件中找到的最后一个匹配时间值,您似乎希望每个键都有一个值数组。你也太辛苦了 IMO,让 fgetcsv 为你完成工作。

<?php

$handle = fopen('test.csv', 'r');

$contentArray = [];
while (($row = fgetcsv($handle, 0, '|')) !== false)
{
    $key = $row[5] . '|' . $row[6] . '|' . $row[7] . '|' . $row[8];

    if(!array_key_exists($key, $contentArray))
    {
        $contentArray[$key] = [];
    }

    $time = $row[9];
    $contentArray[$key][] = $time;
}

fclose($handle);

ksort($contentArray);

foreach($contentArray as $key=>$data)
{
    echo '['.$key.'], '.implode($data, ', ').PHP_EOL;
}