2

我大部分时间都在工作,但我觉得必须有更好的方法来做到这一点。

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

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

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

父系:阿拉伯

大坝品种:纯种

父亲品种:已退休

父亲大坝品种:已退休

Dam Sire 品种:纯种

大坝品种:纯种

退休意味着没有关于他们品种的更多信息,因此可以忽略其中的信息,这很好。

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

任何关于我如何更清洁和/或更简单的提示都会很棒。

谢谢。

4

1 回答 1

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也已更改为保留一个空格。

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

于 2013-01-05T20:36:44.537 回答