如何使用PHP获得唯一的名称计数?

如何使用PHP获得唯一的名称计数?,php,Php,假设我有文本文件Data.txt,其中包含: 26||jim||1990 31||Tanya||1942 19||Bruce||1612 8||Jim||1994 12||Brian||1988 56||Susan||2201 它还在继续 第2列中有许多不同的名称。 请告诉我,如何获得唯一名称的计数,以及每个名称在使用PHP的文件中出现多少次 我试过: $counts = array_count_values($item[1]); echo $counts; 爆炸后| |,但不起作用。 结果

假设我有文本文件Data.txt,其中包含:

26||jim||1990
31||Tanya||1942
19||Bruce||1612
8||Jim||1994
12||Brian||1988
56||Susan||2201
它还在继续

第2列中有许多不同的名称。 请告诉我,如何获得唯一名称的计数,以及每个名称在使用PHP的文件中出现多少次

我试过:

$counts = array_count_values($item[1]);
echo $counts;
爆炸后| |,但不起作用。 结果应该是: 吉姆-2, tanya-1, 等等 感谢您的帮助……

读入每一行,在本例中使用分隔符| |分解,如果它不存在,则将其添加到数组中。如果是,则增加计数

我不会为您编写代码,但这里有几点提示:

排成一行读

将基于分隔符拆分该行

用于检查以前是否找到过该名称,并确定是否需要将该名称添加到数组中,或只是增加计数

编辑:

按照乔恩的建议,你可以让事情变得更容易


逐行读取、按分隔符分解并将所有名称转储到一个数组中—不要担心检查它是否已经存在。完成后,使用以获取每个唯一的名称及其频率。

虽然我确实觉得本网站的目的是回答问题而不是做家庭作业,但我不承认您正在做家庭作业的假设,因为这一事实尚未提供。我个人通过示例学习了如何编程。我们都有自己的学习方式,因此,如果我试图根据您提供的信息尽可能准确地回答您的问题,我会做以下几点

<?php
$unique_name_count = 0;
$names = array();

$filename = 'Data.txt';
$pointer = fopen($filename,'r');
$contents = fread($pointer,filesize($filename));
fclose($pointer);

$lines = explode("\n",$contents);

foreach($lines as $line)
{
    $split_str = explode('|',$line);
    if(isset($split_str[2]))
    {
        $name = strtolower($split_str[2]);
        if(!in_array($name,$names))
        {
            $names[] = $name;
            $unique_name_count++;
        }
    }
}

echo $unique_name_count.' unique name'.(count($unique_name_count) == 1 ? '' : 's').' found in '.$filename."\n";
?>

以下是我对此的看法:

用于读取数据文件,生成一个数组,其中每个元素对应于输入中的一行。 使用with作为筛选函数可从此数组中删除空行。这利用了trim返回一个字符串,该字符串已从其参数的两端删除了空白,如果参数的开头都是空白,则保留空字符串。-因此,使数组_过滤器忽略所有为空白的行。 与回调一起使用,该回调涉及调用explode将文本的每个数组元素行拆分为三个部分,并返回其中的第二个部分。这将生成一个数组,其中每个元素只是一个名称。 再次使用array_map和as回调将所有名称转换为大写,以便jim和jim在下一步的计数相同。 最后,使用获取每个名称的出现次数。 代码,慢慢来:

function extract_name($line) {
    // The -1 parameter (available as of PHP 5.1.0) makes explode return all elements 
    // but the last one. We want to do this so that the element we are interested in
    // (the second) is actually the last in the returned array, enabling us to pull it
    // out with end(). This might seem strange here, but see below.
    $parts = explode('||', $line, -1);
    return end($parts);
}

$lines = file('data.txt'); // #1
$lines = array_filter($lines, 'trim'); // #2
$names = array_map('extract_name', $lines); // #3
$names = array_map('strtoupper', $names); // #4
$counts = array_count_values($names); // #5

print_r($counts); // to see the results
我之所以选择在步骤中执行此操作,是因为每个步骤都涉及对上一步骤的结果进行函数调用,实际上可以在一行中执行此操作:

$counts = array_count_values(
          array_map(function($line){return strtoupper(end(explode('||', $line, -1)));},
          array_filter(file('data.txt'), 'trim')));

print_r($counts);

我应该提到,这可能不是解决问题的最佳方法,因为如果您的输入文件非常大,大概只有几百万行,那么这种方法将消耗大量内存,因为它一次读取内存中的所有输入。然而,这当然很方便,除非你知道投入会那么大,否则没有必要让生活变得更艰难


注意:高级PHP开发人员可能已经注意到,我在这里违反了严格的标准,将explode的结果提供给一个通过引用接受其参数的函数。这是有道理的批评,但在我的辩护中,我试图使代码尽可能简短。在生产中,最好使用$a=爆炸。。。;返回$a[1];尽管结果没有差别。

显示您迄今为止尝试的代码,我们将尝试帮助修复它。但是你必须表现出一些努力——我们不会为你写的。这不是这个网站的工作原理。事实上,如果你以某种方式投射到一个名称数组中,也有可用的名称。@Jon:很好!这几乎解决了他的问题。PHP是一些非常有用的内置函数,有足够的函数将其作为一行程序编写。感谢代码示例。我要说的是,这不是家庭作业。我会试试这个,然后在这里给你回复。再次感谢!为什么会有fopen仪式?还有,为什么要阅读内容,然后在新线新闻上爆炸呢?@Jon:虽然file_get_内容很好,但我个人认为这非常重要,因为它们在其他编程语言中被广泛使用。还要注意$pointer变量-至关重要的?我不记得上次叫fread已经有多少年了。至于广泛使用的,你可能指的是C,因为我所知道的所有其他语言都可以做得更好。我已经运行了代码并修复了一个错误$str是未定义的,当我打算使用foreach中的$line时。我很抱歉。非常感谢你花时间不仅回答我并举例,而且还教了我一些东西。非常感谢。让我试试,然后回到这里给你。。。