2013-01-05 40 views
2

我有這個主要工作,但我覺得必須有一個更好的方式來做到這一點。查找並計算字符串中的字符串,然後顯示最高字符串

在該網站上有~60個馬品種。一些馬是「純種」,一些是「雜交」。純種的我沒有問題,但對於十字架,我需要弄清楚它們最爲相似的品種,以便爲該馬展示圖像。

圖像設置如下:horse-Arabian-breed.png與一些PHP和SQL將馬的品種信息從數據庫中拉下來,並將品種插入「horse-」和「-breed.png」之間。

該網站上的十字架顯示爲這樣的「阿拉伯x荷蘭溫暖血統」,這顯然不適合圖像。我的計劃是看看現在的馬,它的母親和父親,這是四個偉大的父母,得到他們所有的品種,找出哪個品種影響最大,然後使用該品種的形象。

這是我目前有:

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

父系品種:阿拉伯

大壩品種:純種

陛下陛下品種:退休

父親水壩品種:退休

大壩父系品種:純種

壩品種:純種

退休意味着有自己的品種沒有更多的信息,這樣一個被忽略,這是罰款。

我試圖弄清楚的另一件事是如何在兩個或更多品種之間隨機選擇,如果有最高配合的倍數。

任何提示,我如何做到這一點更清潔和/或更容易會很好。

謝謝。

+2

是的,字典確實有效。在PHP中是一個數組:http://php.net/array - 無論如何,在這裏爲所有面包使用一個數組,而不是爲品種使用不同的變量,這將使您的生活更加輕鬆。你需要一些指針? – hakre

+0

我同意最簡潔的方式是使用數組來跟蹤給定馬的品種歷史。現在使用像您這樣的標量,您需要遍歷每個品種類型,並跟蹤由substr_count返回的最大數量以及相關的品種類型。 – Vince

+0

像MySQL這樣的PHP數據庫就足夠了,呃? – 2013-01-05 18:15:03

回答

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

它只是ADDAS在一開始的空間,然後添加元素之後。 x的更換已更改爲保留一個空格。

我希望這給出了一些指針,你可以選擇一些有用的東西。

+0

謝謝,這看起來非常好(和你的解釋很棒!)。雖然[]我似乎有括號中的問題。我不斷收到關於他們的錯誤。有沒有我需要使用的特定PHP版本? – Chelsea

+0

我將括號更改爲數組,並且必須註釋掉一行($ horse_breed_history_main =(object)['count'=> -1];),但它似乎正在運行。那條線是什麼? – Chelsea

+1

好吧,方括號:這是數組的PHP 5.4表示法,當你有更低的PHP版本'[...]'是'array(...)' - 那麼你的錯誤應該消失。請參閱http://php.net/arrays *示例#1一個簡單的數組*顯示兩個變體相鄰。 – hakre

相關問題