2016-12-21 52 views
1

我知道如何在數組中執行此操作,但不知道如何使用對象執行此操作。我的目標是這樣的......PHP獲取和更改對象中的隨機項目

stdClass Object 
(
    [Full] => 10 
    [GK] => 10 
    [Def] => 10 
    [Mid] => 10 
    [Att] => 0 
    [Youth] => 0 
    [Coun] => 0 
    [Diet] => 10 
    [Fit] => 0 
    [Promo] => 10 
    [Y1] => 0 
    [Y2] => 9 
    [Y3] => 0 
    [IntScout] => 0 
    [U16] => 0 
    [Physio] => 4 
    [Ground] => 1 
) 

我需要做一個循環,檢查總的值是不大於一定值(在本例中50)。如果是,我需要他們的一個隨機和1減少它,直到最後的總不高於50

我失敗的嘗試迄今: -

$RandomTrainer = mt_rand(0, (count($this->Trainers) -1)); 
if ($this->Trainers->$RandomTrainer] > 0) { 
$this->Trainers->$RandomTrainer] -= 1; 

顯然,這不起作用,因爲它正在尋找'0'或對象中的某個數字,這不在那裏。

我跳過循環/總計部分,因爲這是在我的結尾工作。

解決方案:不完美,但它的工作原理。

$TrainerArray = get_object_vars($this->Trainers); // Cast into array. 
if ($Total> 50) { // Calculated before the loop. 
    $TrainerFound = 0; 
    while ($TrainerFound == 0) { 
     $RandomTrainer = mt_rand(0, count($TrainerArray)) - 1; // Get a random index in the array of trainers. 
     reset ($TrainerArray); // Set the array to the beginning, not sure if this is needed. 
     while ($RandomTrainer > 0) { 
      next ($TrainerArray); // Keep advancing '$RandomTrainer' times. 
      $RandomTrainer -= 1; 
     } 
     $propertyName = key($TrainerArray); // Get the key at this point in the array. 
     $this->Trainers->$propertyName -= 1; // Reduce the value in the original object at this point by 1. 

可能過於囉嗦,但幾個小時後,我很高興與它只是工作:)

回答

1

你可以得到瓦爾作爲陣列

$vars = get_object_vars($some_std_class_object); 

則:

while(Your_function_to_sum_values($some_std_class_object) > 50) 
{ 
    $propertyName = array_rand($vars); 

    if(some_std_class_object->$propertyName > 0){ 
     some_std_class_object->$propertyName -= 1; 
    } 
} 
+0

我看到你在這裏得到什麼,但它不是很有效。 $ propertyName在這裏仍然只是返回一個數字,所以我仍然不能將它應用於我的對象。我需要獲得我認爲的$ propertyIndex的關鍵字,但不太清楚如何。 '關鍵'似乎需要目前的指數,我認爲我們沒有選擇。 – Farflame

+0

用我的解決方案更新了我的原始帖子。這有點混亂,但它的工作原理。感謝您的建議,我使用了大部分的建議。不知道我是否可以將其標記爲正確的答案,因爲它實際上並不工作。 – Farflame

+0

我的錯...... array_rand實際上返回了propertyName,我更新了我的代碼,所以你可以測試它,並將這個答案標記爲正確。 :) – Pipe