2012-08-12 22 views
2

障礙: 使用多個嵌套數組並且想要在特定位置選擇具有最大int的數組;在所選陣列中更改另一個特定位置的值。是否有方法在數組之間進行選擇,具有最高值的數組用於特定位置

僞代碼可能是這樣的:

$array1 = array(2, 23, 7); 
$array2 = array(2, 21, 7); 

$Mutt = array($L, $P, $O, $array1) 
$Jeff = array($L, $P, $O, $array2) 

find array with max [3][1] { 
('selected' [1]++) 
} 

在現實生活中,這可能是這樣的: 笨蛋($笨蛋)已經被加工本月的大部分時間($笨蛋[3] [1]) , 他已經贏得了額外的「個人日」($ Mutt [1])。

我試圖找到解決辦法。我可能太過於陌生,無法正確理解我的搜索,但我沒有運氣。

+0

WUT?所有那些(嚴重命名的)變量來自哪裏? – PeeHaa 2012-08-12 19:14:07

+0

我知道,不建議使用一個音節變量,但它們代表我的作品中以'L''P'和'O'...以及Mutt和Jeff爲對象的對象。 – 72Monkeys 2012-08-13 01:04:57

回答

2

我希望我已經undestood以及你想要什麼:

你的陣列:

$array1 = array(2, 23, 7); 
$array2 = array(2, 21, 7); 

$Mutt = array($L, $P, $O, $array1); 
$Jeff = array($L, $P, $O, $array2); 

創建一個新的數組$people其中包含$Mutt$Jeff(按引用傳遞)。

$people=array(&$Mutt,&$Jeff); 

創建函數findMaxIndex,它返回它$people[that index]是在我們想要的位置最大值,數組的索引。

它的參數是:

  • $arr,其中包含了我們要比較的陣列的陣列(在這種情況下,$people
  • $pos1$pos2,我們要比較
  • 這是索引

所以...我們將比較

  • $arr[0][$pos1][$pos2]
  • $arr[1][$pos1][$pos2]
  • ...
  • $arr[count($arr)-1][$pos1][$pos2]

此功能的工作原理是這樣的:

  1. 它創建陣列$max,wher e $max[0]是具有最大值的$ arr 的索引(在我們檢查的數組中,直到 時刻),並且$max[1]是該值。
  2. 它通過所有$arr
  3. 迭代如果發現電流值($arr[$i][$pos1][$pos2])比最大值大 ,$max更新,並且成爲 array($i,$arr[$i][$pos1][$pos2])
  4. 最後,它返回$max[0],這是 $people[that index]是我們想要的最大值在位置 位置的索引。

的功能是:

function findMaxIndex($arr,$pos1,$pos2){ 
    $max=array(0,$arr[0][$pos1][$pos2]); 
    for($i=1;$i<count($arr);$i++){ 
     if($arr[$i][$pos1][$pos2]>$max[1]){ 
      $max=array($i,$arr[$i][$pos1][$pos2]); 
     } 
    } 
    return $max[0]; 
} 

然後我們調用函數...

$maxIndex=findMaxIndex($people,3,1); 

...賦予0,所以用最大值陣列是$people[0]$Mutt)最後,我們增加該數組:

$people[$maxIndex][1]++; 

$Mutt$Jeff也被修改,因爲我們通過引用傳遞它們。

總之,

$array1 = array(2, 23, 7); 
$array2 = array(2, 21, 7); 
$Mutt = array($L, $P, $O, $array1); 
$Jeff = array($L, $P, $O, $array2); 
$people=array(&$Mutt,&$Jeff); 
function findMaxIndex($arr,$pos1,$pos2){ 
    $max=array(0,$arr[0][$pos1][$pos2]); 
    for($i=1;$i<count($arr);$i++){ 
     if($arr[$i][$pos1][$pos2]>$max[1]){ 
      $max=array($i,$arr[$i][$pos1][$pos2]); 
     } 
    } 
    return $max[0]; 
} 
$maxIndex=findMaxIndex($people,3,1);//gives `0` -> Max is `$people[0]` 
$people[$maxIndex][1]++; 

==================================== ==========

如果你想在相同的情況下多指標(以粗體顯示):

你的陣列:

$array1 = array(2, 23, 7); 
$array2 = array(2, 21, 7); 

$Mutt = array($L, $P, $O, $array1); 
$Jeff = array($L, $P, $O, $array2); 

創建一個新的陣列$people這包含$Mutt$Jeff

$people=array(&$Mutt,&$Jeff); 

創建函數findMaxIndex,它返回包含這$people[that index]是在我們想要的位置最大值數組索引數組。

它的參數是:

  • $arr,其中包含了我們要比較的陣列的陣列(在這種情況下,$people
  • $pos1$pos2,我們要比較
  • 這是索引

所以......我們將比較

  • $arr[0][$pos1][$pos2]
  • $arr[1][$pos1][$pos2]
  • ...
  • $arr[count($arr)-1][$pos1][$pos2]

此功能的工作原理是這樣的:

  1. 它創建陣列$max,其中$max[0]包含索引數組 of $ arr with the maxi媽媽值(在我們檢查的數組中,直到 時刻),以及$max[1]是那個值。
  2. 它通過所有$arr
  3. 迭代如果發現電流值($arr[$i][$pos1][$pos2])比最大值大 ,$max更新,並且成爲 array(array($i),$arr[$i][$pos1][$pos2])
  4. 如果沒有,並且如果它發現電流值$arr[$i][$pos1][$pos2]等於最大值$max[0]被更新並且$i被推入它。
  5. 最後,它返回$max[0],它是包含索引的數組,其中 $people[that index]是我們想要的最大值位於 位置的數組。

功能是:

function findMaxIndex($arr,$pos1,$pos2){ 
    $max=array(array(0),$arr[0][$pos1][$pos2]); 
    for($i=1;$i<count($arr);$i++){ 
     $current=$arr[$i][$pos1][$pos2]; 
     if($current>$max[1]){ 
      $max=array(array($i),$current); 
     }else if($current==$max[1]){ 
      array_push($max[0],$i); 
     } 
    } 
    return $max[0]; 
} 

然後我們調用函數...

$maxIndex=findMaxIndex($people,3,0); 

...這給array(0,1),因此與最大值陣列$people[0]$Mutt)和$people[1]$Jeff)。

最後,我們增加了數組:

for($i=0;$i<count($maxIndex);$i++){ 
    $people[$maxIndex[$i]][1]++; 
} 

$Mutt$Jeff被修改過,因爲我們按引用傳遞它們。

總之,

$array1 = array(2, 23, 7); 
$array2 = array(2, 21, 7); 
$Mutt = array($L, $P, $O, $array1); 
$Jeff = array($L, $P, $O, $array2); 
$people=array(&$Mutt,&$Jeff); 
function findMaxIndex($arr,$pos1,$pos2){ 
    $max=array(array(0),$arr[0][$pos1][$pos2]); 
    for($i=1;$i<count($arr);$i++){ 
     $current=$arr[$i][$pos1][$pos2]; 
     if($current>$max[1]){ 
      $max=array(array($i),$current); 
     }else if($current==$max[1]){ 
      array_push($max[0],$i); 
     } 
    } 
    return $max[0]; 
} 
$maxIndex=findMaxIndex($people,3,0);//gives `array(0,1)` -> Tie between `$people[0]` and `$people[1]` 
for($i=0;$i<count($maxIndex);$i++){ 
    $people[$maxIndex[$i]][1]++; 
} 
+0

您可以評論該功能。我不確定我是否遵守。我試圖通過你的例子(謝謝你,順便說一句),但是我沒有看到函數如何改變所選陣列的位置。 – 72Monkeys 2012-08-12 22:55:18

+0

@ 72Monkeys我編輯過它,添加註釋並增加數組[1]的位置。 – Oriol 2012-08-12 23:56:57

+1

這是一個令人難以置信的詳細答案,非常友善。非常感謝您的知識! – 72Monkeys 2012-08-13 01:07:23

2

我不確定您的最大價值對整體問題有多重要。這看起來很凌亂。我想到了3種不同的方式來處理這個問題。

  1. 創建和添加數組,每當arrayt發生突變時都會保存並更新最大值。這是很骯髒,並不是一個很好的解決方案,但取決於項目的價值可能是好的。
  2. 編寫一個函數來搜索最高值,過度但會工作。
  3. 稍微提前一點,但可能是最專業的解決方案,使用類重新設計您的程序。每個數組現在將成爲它自己的一個對象。每個對象都可以跟蹤它自己的最大值在類變量中使用它的增變器或添加功能隨時更新它。現在你只需要有一個由這些對象組成的數組,並且該數組可以很容易地排序(使用該值的訪問器對每個對象的最大值進行排序),然後從數組的頂部或底部拉取對象,具體取決於你用哪種方式對它進行分類您可能希望在課程級別編寫一個私人搜索功能,以便在創建過程中發現最大的價值。
相關問題