首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从多维数组中计算数组中的总数

如何从多维数组中计算数组中的总数
EN

Stack Overflow用户
提问于 2013-02-21 23:51:54
回答 4查看 87关注 0票数 0

我有一个来自报告的数组。

此报告包含类似于以下内容的信息:

代码语言:javascript
运行
复制
157479877294,OBSOLETE_ORDER,obelisk,19/01/2013 01:42pm
191532426695,WRONG_PERFORMANCE,g3t1,19/01/2013 01:56pm
159523681637,WRONG_PERFORMANCE,g3t1,19/01/2013 01:57pm
176481653889,WRONG_PERFORMANCE,g4t1,19/01/2013 01:57pm
167479810401,WRONG_PERFORMANCE,g4t1,19/01/2013 02:00pm
172485359309,WRONG_PERFORMANCE,g4t2,19/01/2013 02:02pm
125485358802,WRONG_PERFORMANCE,g4t2,19/01/2013 02:02pm
172485359309,DAY_LIMIT_EXCEEDED,obelisk,19/01/2013 02:03pm
125485358802,DAY_LIMIT_EXCEEDED,obelisk,19/01/2013 02:03pm

我需要做的是得到每种类型错误的总数和位置,所以第一个错误是错误:'OBSOLETE_ORDER‘和位置:’方尖碑‘。我尝试过很多方法,但我能想到的最好的方法是多维数组:

代码语言:javascript
运行
复制
$error_handle = fopen("$reportUrl", "r");
while (!feof($error_handle) )
   {
      $line_of_text = fgetcsv($error_handle, 1024);
      $errorName = $line_of_text[1];
      $scannerName = $line_of_text[2];
      if($errorName != "SCAN_RESULT" && $errorName != "" && $scannerName != "SCAN_LOGIN" && $scannerName != "")
          {
              $errorsArray["$errorName"]["$scannerName"]++;
          }
   }
fclose($error_handle);
print_r($errorsArray);

为我提供了以下内容:

代码语言:javascript
运行
复制
Array ( [OBSOLETE_ORDER] => Array ( [obelisk] => 1 ) [WRONG_PERFORMANCE] => Array ( [g3t1] => 2 [g4t1] => 2 [g4t2] => 2 ) [DAY_LIMIT_EXCEEDED] => Array ( [obelisk] => 2 ) )

哪一个是great...except然后我如何把它拆开添加到我的sql数据库中?!(我感兴趣的是在数组所在的key下获取key和该key的合计)

然后将其添加到表中

-错误-(索引)id_errors id_event id_access_scanner id_errors_type total_errors

-errors_type- (索引)id_errors_type name_errors_type

-access_scanner(索引)id_access_scanner id_portal name_access_scanner

请帮帮我!

谢谢!

EN

回答 4

Stack Overflow用户

发布于 2013-02-22 00:48:34

多维数组超出了您的需要。要采用的方法是创建您自己的字符串(在我的示例中为$arrayKey),将其用作组合扫描仪名称和错误的数组键,以便您可以获得计数。

代码语言:javascript
运行
复制
//this is the array containing all the report lines, each as an array
$lines_of_text;

//this is going to be our output array
$errorScannerArray = array();

//this variable holds the array key that we're going to generate from each line
$arrayKey = null;

foreach($lines_of_text as $line_of_text)
{
    //the array key is a combination of the scanner name and the error name
    //the tilde is included to attempt to prevent possible (rare) collisions
    $arrayKey = trim($line_of_text[1]).'~'.trim($line_of_text[2]);

    //if the array key exists, increase the count by 1
    //if it doesn't exist, set the count to 1
    if(array_key_exists($arrayKey, $errorScannerArray))
    {
        $errorScannerArray[$arrayKey]++;
    }
    else
    {
        $errorScannerArray[$arrayKey] = 1;
    }
}

//clean up
unset($line_of_text);
unset($arrayKey);
unset($lines_of_text);

//displaying the result
foreach($errorScannerArray as $errorScanner => $count)
{
    //we can explode the string hash to get the separate error and scanner names
    $names = explode('~', $errorScanner);
    $errorName = $names[0];
    $scannerName = $names[1];

    echo 'Scanner '.$scannerName.' experienced error '.$errorName.' '.$count.' times'."\n";
}
票数 0
EN

Stack Overflow用户

发布于 2013-02-22 01:03:35

对于你编辑过的问题,这个简单得多的循环将为你工作,然后你只需要将数据插入到循环中的数据库中,而不是回显出来:

代码语言:javascript
运行
复制
$errorsArray = Array (
        [OBSOLETE_ORDER] => Array (
                                    [obelisk] => 1 
                                )
        [WRONG_PERFORMANCE] => Array (
                                    [g3t1] => 2 
                                    [g4t1] => 2 
                                    [g4t2] => 2 
                                ) 
        [DAY_LIMIT_EXCEEDED] => Array ( 
                                    [obelisk] => 2 
                                ) 
    )

foreach($errorsArray as $row => $errors) {
    foreach($errors as $error => $count) {
        echo $row;  // 'OBSOLETE_ORDER'
        echo $error;    // 'obelisk'
        echo $count;    // 1
        // insert into database here
    }
}

旧的答案你只需要一个新的数组来保存你需要的信息,最好是一个计数。我假设正确的数据格式是:

代码语言:javascript
运行
复制
$report = [
  ['157479877294','OBSOLETE_ORDER','obelisk','19/01/2013 01:42pm'],
  ['191532426695','WRONG_PERFORMANCE','g3t1','19/01/2013 01:56pm'],
  ['159523681637','WRONG_PERFORMANCE','g3t1','19/01/2013 01:57pm'],
  ['176481653889','WRONG_PERFORMANCE','g4t1','19/01/2013 01:57pm'],
  .....
];

foreach($report as $array) {
  $errorName = $array[1];
  $scannerName = $array[2];
  if(exists($errorsArray[$errorName][$scannerName])) {
    $errorsArray[$errorName][$scannerName] = $errorsArray[$errorName][$scannerName] + 1;
  }
  else {
    $errorsArray[$errorName][$scannerName] = 1;
  }
}
票数 0
EN

Stack Overflow用户

发布于 2013-02-22 01:04:18

代码语言:javascript
运行
复制
$list = array();
foreach ($lines as $line) {
    $values = explode(',' $line);
    $error = $values[1];
    $scanner = $values[2];
    if (!isset($list[$error])) {
         $list[$error] = array();
    }
    if (!isset($list[$error][$scanner])) {
         $list[$error][$scanner] = 1;
    } else {
         $list[$error][$scanner]++;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15006537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档