仅对数组中的值1求和

时间:2017-03-17 18:47:40

标签: php arrays sum

我的数组包含从$ qA01_1到$ qA30_5(150个变量)的变量。某些变量的值可以是0或1或5(例如$ qA21_3 = 0或1或5)。我想知道如何对所有具有值1的变量求和。

这里是数组的一部分

$qA01_1 = $_SESSION['qA01_1']; // example: $qA01_01 can have value 0 or 1 or 5, like other variables  
$qA01_2 = $_SESSION['qA01_2']; // $qA01_02 = 0 or 1 or 5
$qA01_3 = $_SESSION['qA01_3']; // $qA01_03 = 0 or 1 or 5
$qA01_4 = $_SESSION['qA01_4']; // $qA01_04 = 0 or 1 or 5
$qA01_5 = $_SESSION['qA01_5']; // $qA01_05 = 0 or 1 or 5

$qA02_1 = $_SESSION['qA02_1']; // $qA02_01 = 0 or 1 or 5   
$qA02_2 = $_SESSION['qA02_2']; // $qA02_02 = 0 or 1 or 5
$qA02_3 = $_SESSION['qA02_3']; // $qA02_03 = 0 or 1 or 5
$qA02_4 = $_SESSION['qA02_4']; // $qA02_04 = 0 or 1 or 5
$qA02_5 = $_SESSION['qA02_5']; // $qA02_05 = 0 or 1 or 5

// up to...

$qA30_1 = $_SESSION['qA30_1']; // $qA30_01 = 0 or 1 or 5    
$qA30_2 = $_SESSION['qA30_2']; // $qA30_02 = 0 or 1 or 5
$qA30_3 = $_SESSION['qA30_3']; // $qA30_03 = 0 or 1 or 5
$qA30_4 = $_SESSION['qA30_4']; // $qA30_04 = 0 or 1 or 5
$qA30_5 = $_SESSION['qA30_5']; // $qA30_05 = 0 or 1 or 5

这是提案,但不是工作。我请问,请求帮助。

$values = [];
for($i=1;$i<=30;$i++)
{
    foreach([1,2,3,4,5] as $index) 
    {
        if(${'qA'.str_pad($i, 2, "0", STR_PAD_LEFT).'_'.$index} == 1) 
        {
            $values[] = ${'qA'.str_pad($i, 2, "0", STR_PAD_LEFT).'_'.$index};
        }
    }
} 
echo $values;

5 个答案:

答案 0 :(得分:2)

只需遍历$_SESSION数组:

// This is where we'll hold all the saved numbers
// from values ending with _1
$array_of_numbers = [];

// Loop through each session
foreach ( $_SESSION as $key => $val )
{
  // Only save the keys that match and equal 1
  if ( preg_match('/^qA\d{2}?_\d$/', $key, $matches) && $val == 1 )
  {
    $array_of_numbers[] = $val;
  }
}

// Sum the numbers that we gathered
$sum_of_array = array_sum($array_of_numbers);

答案 1 :(得分:0)

如果您只想要总和,则不需要$values数组。只需将值添加到$sum变量。

$sum = 0;
for($i=1;$i<=30;$i++)
{
    foreach([1,2,3,4,5] as $index) 
    {
        $var = 'qA'.str_pad($i, 2, "0", STR_PAD_LEFT).'_'.$index
        if(${$var} == 1) 
        {
            $sum += ${$var};
        }
    }
} 
echo $sum;
顺便说一下,你无法回应数组。如果要查看数组的内容,请使用var_dump($values);print_r($values);

答案 2 :(得分:0)

重新思考的时候了。没理由像你一样解压缩数组。

让我们感兴趣的$_SESSION值放入一个新数组并使用它。 (没有必要放入一个新的数组,我只是不喜欢超出必要的超级全局变量)

//Create new array
$myArray = [];
foreach( $_SESSION as $key=>$val ){
  if( preg_match('/qA\d{2}_[1-5]/', $key) ){
    $myArray[$key] = $val;
  }
}

$sum = 0;
foreach( $myArray as $key=>$val ){
  if( preg_match('/qA\d{2}_1/', $key) ){
    $sum += $val;
  }
}

var_dump($sum);

答案 3 :(得分:0)

由于这里的逻辑有点令人困惑,我认为将它分成几个“自我记录”功能将是更好的实践。这样的事情应该有效:

$sum = 0;
for ($i = 1; $i <= 30; $i++) {
    for ($j = 1; $j <= 5; $j++) {
        $qa_index = qa_index($i, $j);
        if ($_SESSION[$qa_index] == 1)
            $sum++; // no need to _actually_ sum since it's just 1
    }
}

function qa_index($major, $minor) {
    return 'qA'.left_pad_zeros($major).'_'.$minor."\n";
}

function left_pad_zeros($val, $pad_amount = 2) {
    return str_pad($val, $pad_amount, '0', STR_PAD_LEFT);
}
编辑:我想有些人可能认为函数在这里是不必要的开销。这可能是因为无论什么应用程序使用此需求来挤出他们可以提高的每一点性能。但是,如果情况并非如此,我认为这是更好的做法,因为它更容易阅读和维护。

答案 4 :(得分:0)

 $TotalVal = 0;
 for($i=1; $i<=5; $i++){
    for($j=1; $j<=5; $j++){
      If($i<10){
    $StrVar = 'qA0'.$j.'_'.$i.'[0]'; // considering ur using array if not remove [0].
      If ($$StrVar == 1)
        $TotalVal = $TotalVal + $$StrVar;
      }else{
       $StrVar = 'qA'.$j.'_'.$i.'[0]';
       If ($$StrVar == 1)
         $TotalVal = $TotalVal + $$StrVar;
      }
   }
}
echo $TotalVal;

如果条件

需要5次更改,这将给出所有值为1的总和