php - 查找并计算字符串中的字符串,然后显示计数最高的字符串

标签 php string count

我的这个大部分工作正常,但我觉得必须有更好的方法来做到这一点。

网站上有约 60 个马品种。有些马是“纯种”,有些是“杂种”。我对纯种马没有意见,但对于杂交,我需要找出它们最相似的品种,以便显示该马的图像。

图像的设置如下:horse-Arabian-breed.png,使用一些 PHP 和 SQL 从数据库中提取马的品种信息,并将品种插入“horse-”和“-breed.png”之间。

网站上的十字架显示为“阿拉伯 x 荷兰温血马”,这显然不适用于图像。我的计划是查看当前的马,它的母亲和父亲,以及它的四个祖 parent ,获取它们的所有品种,找出哪个品种影响最大,然后使用该品种的图像。

这是我目前拥有的:

echo "Start horse breed: $horse_breed <br>";
echo "Sire  breed: $sire_breed <br>";
echo "Dam breed: $dam_breed <br>";
echo "Sire Sire breed: $sire_sire_breed <br>";
echo "Sire Dam breed: $sire_dam_breed <br>";
echo "Dam Sire breed: $dam_sire_breed <br>";
echo "Dam Dam breed: $dam_dam_breed <br>";
echo "<br><br>";

$hb = strval($horse_breed);
$sb = strval($sire_breed);
$db = strval($dam_breed);
$ssb = strval($sire_sire_breed);
$sdb = strval($sire_dam_breed);
$dsb = strval($dam_sire_breed);
$ddb = strval($dam_dam_breed);

$breed_hist = $hb.$sb.$db.$ssb.$sdb.$dsb.$ddb; 

echo $breed_hist; // outputs: Arabian x ThoroughbredArabianThoroughbredRetiredRetiredThoroughbredThoroughbred

echo "<br>";

$clean_hist = str_replace(" x ", "", $breed_hist);

echo $clean_hist; // outputs: ArabianThoroughbredArabianThoroughbredRetiredRetiredThoroughbredThoroughbred

echo "<br>";

$Arabian = substr_count($clean_hist, 'Arabian');
echo "Arabian: $Arabian"; // output: 2
echo "<br>";

$Thoroughbred = substr_count($clean_hist, 'Thoroughbred');
echo "Thoroughbred: $Thoroughbred"; // output: 4
echo "<br>";

$Warlander = substr_count($clean_hist, 'Warlander');
echo "Warlander: $Warlander"; // output: 0
echo "<br>";`

最重要的是,我有一些基本的 SQL 从数据库中提取信息。

我知道您可以在 PHP 中使用 max() 来查找最高值,但我不确定如何将最高值与正确的品种链接起来(我猜字典会起作用吗?)。

出于测试目的,我一直在使用:

起始马品种:阿拉伯 x 纯种

父系品种:阿拉伯

母亲品种:纯种

父亲 父亲品种:退休

父系母犬品种:退役

母本品种:纯种

大坝品种:纯种

退役意味着没有更多关于其品种的信息,因此被忽略,这很好。

我试图弄清楚的另一件事是,如果有多个品种与最高品种并列,如何在两个或多个品种之间随机选择。

任何有关如何更干净和/或更轻松地完成此操作的提示都会很棒。

谢谢。

最佳答案

我希望这能给您一些指导,预先创建定义实际使用的数据的数组。这些将有助于获取您正在寻找的信息。因为这些是数组,所以大多数事情都可以以迭代方式完成(请参阅 foreach ,这通常很不错。我实际上使用它两次,第一次是为了创建历史,第二次是为了找出哪个品种是最重要的:

$breeds = ['Arabian', 'Retired', 'Thoroughbred', 'Warlander'];

$breed_combos = [
    'horse'     => 'Start horse',
    'sire'      => 'Sire',
    'dam'       => 'Dam',
    'sire_sire' => 'Sire Sire',
    'sire_dam'  => 'Sire Dam',
    'dam_sire'  => 'Dam Sire',
    'dam_dam'   => 'Dam Dam',
];


// combine history
$horse_breed_history = '';
foreach ($breed_combos as $breed_combo_key => $breed_combo_label) {
    $variable = sprintf("%s_breed", $breed_combo_key);
    $breed    = isset($$variable) ? $$variable : random_breed(); # you have the variable set
    printf("%' 12s breed: %s\n", $breed_combo_label, $breed);
    $horse_breed_history .= str_replace(' x ', '', $breed);
}
echo '           History: ', $horse_breed_history, "\n";


// count and pick highest
$horse_breed_history_main = (object)['count' => -1];
foreach ($breeds as $breed) {
    $count = substr_count($horse_breed_history, $breed);
    if ($count > $horse_breed_history_main->count) {
        $horse_breed_history_main->breed = $breed;
        $horse_breed_history_main->count = $count;
    }
}
echo '         Top breed: ', $horse_breed_history_main->breed, "\n";

一些示例(我在这里使用随机值,因为我没有数据库,也不确定所有品种):

 Start horse breed: Thoroughbred x Retired
        Sire breed: Warlander
         Dam breed: Retired
   Sire Sire breed: Retired x Arabian
    Sire Dam breed: Retired
    Dam Sire breed: Arabian
     Dam Dam breed: Retired x Warlander
           History: ThoroughbredRetiredWarlanderRetiredRetiredArabianRetiredArabianRetiredWarlander
         Top breed: Retired

这些品种和历史可能没有多大意义,但它应该显示它是如何运作的。

我不知道你的数据库结构是什么,也许你也可以在数据库中通过一些查询来完成此操作,这最终可能是最好的。如果没有,此示例演示如何处理字符串计数并在迭代所有可能的品种时获取最高计数。

顺便说一句,如果您用空格连接,您可以创建更好分隔的字符串:

" Arabian Arabian Retired Thoroughbred Retired Warlander Arabian Thoroughbred Warlander "

允许在分隔符(此处为空格)上分解,然后使用array_count_values计算实际值,然后使用arsort降序排序然后第一个条目是最高的:

$string = " Arabian Arabian Retired Thoroughbred Retired Warlander Arabian Thoroughbred Warlander ";
$values = array_count_values(explode(' ', trim($string)));
arsort($values);
print_r($values);

我想说,如果你不能在数据库中做到这一点,那么对于你的情况来说,这对于 PHP 来说是最好的。

Array
(
    [Arabian] => 3
    [Warlander] => 2
    [Retired] => 2
    [Thoroughbred] => 2
)

这是上面用于创建空格分隔列表的代码块:

// combine history
$horse_breed_history = ' ';
foreach ($breed_combos as $breed_combo_key => $breed_combo_label) {
    $variable = sprintf("%s_breed", $breed_combo_key);
    $breed    = isset($$variable) ? $$variable : random_breed(); # you have the variable set
    printf("%' 12s breed: %s\n", $breed_combo_label, $breed);
    $horse_breed_history .= str_replace(' x ', ' ', $breed) . ' ';
}
echo '           History: ', $horse_breed_history, "\n";

它只是在最开始添加一个空格,然后在添加元素之后添加一个空格。此外,x 的替换已更改为保留一个空格。

我希望这能给你一些指导,你可以从中挑选出一些有用的东西。

关于php - 查找并计算字符串中的字符串,然后显示计数最高的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14174689/

相关文章:

php - 在多个域中包含单个 javascript 文件

php - PDF文件压缩

php - 按索引对 stdClass 对象进行排序

java - 如何让所有输出行从左到右打印?

r - 某个因素级别内的记录计数

php - 将标题大小写应用于字符串中除指定首字母缩略词之外的所有单词

Java:处理大数据的通用 BaseN 编码器/解码器

Javascript 在连接期间 chop 字符串

java - 递归计算字符串中的大写字符

arrays - 计数查询、物化 View 的 PostgreSQL 效率