在字符串中查找和计算字符串然后显示具有最高计数的字符串

时间:2013-01-05 17:59:28

标签: php string count

我有这个主要工作,但我觉得必须有一个更好的方法来做到这一点。

在网站上有大约60匹马品种。有些马是“纯种”的,有些是“杂交”。纯种马我没有问题,但对于十字架,我需要找出它们最接近的品种,以显示那匹马的图像。

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

网站上的十字架显示为“Arabian x Dutch Warmblood”,这显然不适用于图像。我的计划是看看现在的马,它的母亲和父亲,以及它的四个大父母,得到他们所有的品种,找出哪个品种影响最大,然后使用该品种的形象。

以下是我目前的情况:

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()来找到最高值,但我不确定如何将最高值与正确的品种联系起来(我猜一本字典会起作用吗?)。

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

开始马品种:Arabian x Thoroughbred

父系品种:阿拉伯人

大坝品种:纯种

Sire Sire品种:退休

Sire Dam品种:已退休

Dam Sire品种:纯种马

Dam Dam品种:纯种

退役意味着他们的品种没有更多信息,因此忽略了一个,这很好。

我想弄清楚的另一件事是,如果存在最高的倍数,如何在两个或更多品种之间随机选择。

关于我如何做到更清洁和/或更容易的任何提示都会很棒。

感谢。

1 个答案:

答案 0 :(得分:2)

我希望这能为您提供一些指导,预先创建数组来定义实际使用的数据。这些有助于获取您正在寻找的信息。因为那些是数组,大多数事情都可以以迭代的方式完成(参见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 "

允许explode分隔字符(此处为空格),然后使用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的替换已更改为保留一个空格。

我希望这会给出一些指示,你可以选择一些有用的东西。