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]++)
}

在现实生活中,这可能看起来像:Mutt ($Mutt) 本月工作的天数最多 ($Mutt [3][1]),他获得了额外的“个人日”($Mutt [1])。

我试图找到解决方案。我可能太新了,无法理解如何正确地用词来搜索,但我没有运气。

4

2 回答 2

2

我不确定您的最大值对整体问题有多重要。这看起来有点乱。我想了 3 种不同的方法来处理这个问题。

  1. 每次数组发生突变时,创建和添加数组以保存和更新最大值。这很快很脏,不是一个很好的解决方案,但取决于项目的过高价值可能没问题。
  2. 编写一个函数来搜索最大值,过度但会起作用。
  3. 更先进但可能是最专业的解决方案,使用类重新设计您的程序。每个数组现在都将成为它自己的对象。每个对象都可以使用它的 mutator 在类变量中跟踪它自己的最大值,或者添加函数来随时更新它。现在您可以简单地拥有一个由这些对象组成的数组,并且可以轻松对该数组进行排序(使用该值的访问器按每个对象的最大值排序)然后只需根据数组的顶部或底部拉出对象你用哪种方式排序的。您可能希望在类级别上编写一个私人搜索功能,以找到创造的最大价值。
于 2012-08-12T19:32:32.440 回答
2

我希望我已经很好地理解了你想要的东西:

你的数组:

$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]是具有最大值的 $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]是一个数组,其中包含具有最大值的 $arr的索引$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]++;
}
于 2012-08-12T19:52:56.180 回答