2

私はこれでほとんど機能していますが、もっと良い方法が必要だと感じています。

サイトには 60 頭ほどの馬がいます。いくつかの馬は「純血」であり、いくつかは「雑種」です。純血種については問題ありませんが、交配種については、その馬の画像を表示するために、どの品種に最もよく似ているかを把握する必要があります。

画像は次のように設定されています: horse-Arabian-breed.png に PHP と SQL を使用して、データベースから馬の品種情報を取得し、"horse-" と "-breed.png" の間に品種を挿入します。

サイトの十字架は、この「アラビアン x オランダの温血」のように示されていますが、これは明らかに画像にはうまく機能しません。私の計画は、現在の馬、その母と父、そして 4 人の祖父母を見て、すべての品種を取得し、どの品種が最も影響力があるかを判断し、その品種の画像を使用することです。

これが私が現在持っているものです:

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() を使用して最高値を見つけることができることは知っていますが、最高値を適切な品種にリンクする方法がわかりません (辞書が機能すると思いますか?)。

テスト目的で、私が使用してきたもの:

開始馬種:アラビアン×サラブレッド

種雄牛の品種: アラビアン

ダムの品種: サラブレッド

種牡馬 種牡馬: リタイア

サイアー ダムの品種: 引退

ダムサイアー種: サラブレッド

ダム ダムの品種: サラブレッド

引退したということは、彼らの品種に関する情報がこれ以上ないことを意味するため、無視されますが、これは問題ありません。

私が理解しようとしているもう 1 つのことは、複数の品種が最も高く同点になっている場合に、2 つ以上の品種からランダムに選択する方法です。

これをよりきれいに、および/またはより簡単に行う方法に関するヒントは素晴らしいでしょう。

ありがとう。

4

1 に答える 1

2

これにより、実際に使用されるデータを定義する配列を事前に作成して、いくつかの指針が得られることを願っています。それらは、探している情報を取得するのに役立ちます。これらは配列であるため、ほとんどのことは反復的な方法で実行できます (参照foreachしてください。通常はうまくいきません。実際には 2 回使用します。1 回目は履歴を作成するため、2 回目はどの品種がトップカウントであるかを調べるためです。

$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";

最初にスペースを追加し、要素を追加した後に追加します。の置換もx1 つのスペースを保持するように変更されました。

これがいくつかの指針を示し、その中から有用なものを選択できることを願っています.

于 2013-01-05T20:36:44.537 に答える