PHP脚本和max()值


PHP Script and max() Value

很抱歉我的英语不好,提前感谢你的帮助!我在编码时遇到了一个棘手的问题。关键是:

我需要一个脚本,基本上提取5个数组的5个最大值,这是"混合",即它们包含"循环"值。下面是一个例子:

array1(a, b)
array2(a, c, d, e, g)
array3(b, d, g, h)
array4(e, t, z)
array5(b, c, d, k)

两个基本请求是:

1) 5个数组的和(array1+array2+array3…)必须是最高的…

2)…不重复任何先前使用的值**(例如,如果在array1中顶部值是"b",则不能在数组3或5中重用该值作为最大值)。

目前我有这个…:

 $group1 = array(a, b);
 $group = array(a, b, c, d);
 $max1a = max(group1);
 $max2a = max(group2) unset($max1a);
 $sum1 = $max1a + $max2a;
 $max2b = max(group2);
 $max1b = max(group1) 
 unset($max2b);
 $sum2 = $max1b + $max2b;
 if($sum1 > $sum2) {
    echo $sum1
 } else {
    echo $sum2
 } 

…但是在5个数组中使用这段代码是不可能的,因为我应该比较5个!(120…!!)组合,以便找到最大和值。

我知道这个问题很难解释和解决,但我真的需要你的帮助,我希望你能救我!!

欢呼

我添加这个作为另一个答案,留下前一个完整的人遇到这个寻找这种行为的变化。

给定两个数组:

$array1 = array(30, 29, 20);
$array2 = array(30, 20, 10);

使用每个元素中的一个元素的最大和是59 -这与我之前的方法(以及其他人的答案)有很大的不同,我之前的方法是取第一个数组的最大元素,然后取下一个数组的最高元素,不等于任何先前使用的值-这将给出50。

你想要的代码是:

$mainArray = array();
$mainArray[] = array(30, 29, 20);
$mainArray[] = array(30, 20, 10);
$tempArray = array();
$newArray = array();
foreach($mainArray as $innerArray) {
    $newArray = array();
    if (count($tempArray) == 0) {
        foreach ($innerArray as $value) {
            $newArray[] = array('total' => $value, 'used' => array($value));
        }
    }
    else {
        foreach ($tempArray as $key => $innerTempArray) {
            $placed = FALSE;
            foreach ($innerArray as $value) {
                if (!(in_array($value, $innerTempArray['used']))) {
                    $newArray[] = array('total' => $tempArray[$key]['total'] + $value, 'used' => $tempArray[$key]['used']);
                    $newArray[count($newArray) - 1]['used'][] = $value;
                    $placed = TRUE;
                }
            }
            if (!($placed)) {
                echo "An array had no elements that had not already been used";
                die();
            }
        }
    }
    $tempArray = $newArray;
}
$total = 0;
if (count($newArray) == 0) {
    echo "No data passed";
    die();
}
else {
    $total = $newArray[0]['total'];
}
for ($i = 0; $i < count($newArray); $i++) {
    if ($newArray[$i]['total'] > $total) {
        $total = $newArray[$i]['total'];
    }
}
var_dump($total);

编辑-不要重复使用的变量(但重复的值是可以的):

让//$a = 30 $b = 30 $c = 25 $d = 20 $e = 19$array1 = array($a, $c, $d);$array2 = array($b, $d, $e);

我们希望从$array1中选择$a,从$array2中选择$b,因为它们给出了最大的和-尽管它们的值是允许的相同的,因为我们只关心保存到该位置的变量的名称是否相同。

对于上述格式的数组,没有办法实现期望的行为-数组不知道将值赋给其元素的变量的名称,只知道它的值。因此,我们必须将原始答案的第一部分更改为:

$mainArray[] = array('a', 'c', 'd');
$mainArray[] = array('b', 'd', 'e');

,并且在第一个foreach循环之前(声明$a, $b, $c, $d, $e)

//either
extract(array(
    'a' => 30,
    'b' => 30,
    'c' => 25,
    'd' => 20,
    'e' => 19
));
//or
$a = 30; $b = 30; $c = 25; $d = 20; $e = 19;

上面两个都做同样的事情,我只是更喜欢第一个整洁。

然后替换

下面的行
$newArray[] = array('total' => $value, 'used' => array($value));

$newArray[] = array('total' => ${$value}, 'used' => array($value));

改变是在第一个$值周围加上花括号,因为它会被求值以获得要使用的变量名(如下面的例子):

$test = 'hello';
$var = 'test';
echo ${$var}; //prints 'hello'

类似的变化替换

$newArray[] = array('total' => $tempArray[$key]['total'] + $value, 'used' => $tempArray[$key]['used']);

$newArray[] = array('total' => $tempArray[$key]['total'] + ${$value}, 'used' => $tempArray[$key]['used']);

现在代码将按需要运行:)

如果你是动态构建数组,你比较和不能建立数组的字符串而不是变量,那么没有办法做到这一点。你需要某种方法从$a = 30中提取"$a"或"a",这是PHP不应该做的(有hack,但它们很复杂,只在某些情况下工作(谷歌"get变量名作为字符串在PHP中"看到我的意思)

如果你指的是按字母顺序排列的第一个值,那么以下内容就可以了:

$array1 = array('a', 'b');
$array2 = array('a', 'c', 'd', 'e', 'g');
$array3 = array('b', 'd', 'g', 'h');
$array4 = array('e', 't', 'z');
$array5 = array('b', 'c', 'd', 'k');
$mainArray = array($array1, $array2, $array3, $array4, $array5);
foreach ($mainArray as $key => $value) {
    sort($mainArray[$key]);
}
$resultArray = array();
foreach($maniArray as $key1 => $value1) {
    $placed = FALSE;
    foreach ($value1 as $value2) {
        if (!(in_array($value2, $resultArray))) {
            $resultArray[] = $value2;
            $placed = TRUE;
            break;
        }
    }
    if (!($placed)) {
        echo "All the values in the " . ($key + 1) . "th array are already max values in other arrays";
        die();
    }
}
var_dump($resultArray);

我不确定,我是否真的理解了你的问题,这些是我的假设:

  • 你有五个数组包含数字
  • 这些数字可以在数组中多次出现
  • 你想找到数组中元素的最大可能和
  • sum使用每个数组的单个值
  • 但是总和不能使用相同的数字两次

正确吗?

如果是,则:

所有数组的和总是最大元素的和。如果您不想使用相同的数字两次,您可以从第一个数组中获取最大值,然后从所有其他数组中删除它,然后将所有剩余的最大值求和。

一样:

$arrays = array();
$arrays[] = array(1, 2);
$arrays[] = array(1, 3, 4, 5, 7);
$arrays[] = array(2, 4, 7, 8);
$arrays[] = array(5, 20, 26);
$arrays[] = array(2, 3, 4, 11);
for($i=0, $n=count($arrays); $i<$n; $i++) {
    if($i===0) {
        $a1max = max($arrays[$i]);
        $sum = $a1max;
    } else {
        $duplicate_pos = array_search($a1max, $arrays[$i]);
        if($duplicate_pos !== FALSE) {
            unset($arrays[$i][$duplicate_pos]);
        }
        $sum += max($arrays[$i]);
    }
}
echo "sum: " . $sum . "'n";

假设您已经像这样将所有值分组到一个数组中,

$array = array(
    array(1,2,3),
    array(1,2,3,4),
    array(1,2,3,4,5,6),
    array(1,2,3,4,5,6),
    array(1,2,3,4,5,6,7)
); 

遍历$array,得到之前没有使用过的最大值,

$max = array(); 
foreach($array as $value)
    $max[] = max(array_diff($value, $max));

array_sum()计算所有值的和,

echo "The maximal sum is: ".array_sum($max);