php 如何计算每列的数组值?

9cbw7uwe  于 2023-01-08  发布在  PHP
关注(0)|答案(4)|浏览(132)

我有一个这样的数组

$chunk  = 4; 

$arr    = array('1', '1', '1', '1', '1', '1', '1', '0', '1', '0', '1', '0', '0', '0', '0', '1');

我根据$chunk将这个数组修改为行和列,在这个例子中,它是4x4行和列。
我想做的是如何计算每列中有多少个"1"或"0",并打印"1"或"0"的最大输出。
示例:

1110
1101
1110
1001

there are 4 number '1' in first column, so the output should be 4

我的当前代码:

function array_chunk_vertical($arr, $percolnum){
$n = count($arr);
$mod    = $n % $percolnum;
$cols   = floor($n / $percolnum);
$mod ? $cols++ : null ;
$re     = array();
for($col = 0; $col < $cols; $col++){
    for($row = 0; $row < $percolnum; $row++){
        if($arr){
            $re[$row][]   = array_shift($arr);
        }
    }
}
return $re;
}

$result = array_chunk_vertical($arr, $chunk);
$new    = 0;
$exist  = 0;

foreach($result  as $row){
    foreach($row as $val){
        if($val == "1"){
            $new++;
        }
        else{
            $exist++;
        }
            echo $val;          
    }
    echo '<br/>';
}
wnavrhmk

wnavrhmk1#

非常短的代码片段,以帮助您的结果。

$i = 0;
foreach($result as $k => $v){
    $temp[$k] = count(array_filter(array_column($result,$i)));
    $i++;
}

在上面的代码中,array_column将从索引为0、1的所有数组中获取数据,依此类推。
array_filter将删除0值(默认性质)。
下面的输出包括所有第1个垂直计数。

    • 产出**
Array
(
    [0] => 4
    [1] => 3
    [2] => 2
    [3] => 1
)

Demo

3j86kqsm

3j86kqsm2#

$arr    = array('1', '1', '1', '1', '1', '1', '1', '0', '1', '0', '1', '0', '0', '0', '0', '1');

// Split your array in chunks
$chunks = array_chunk($arr, 4);
// Max counts for 1 and 0 
$max1 = $max0 = 0;
foreach ($chunks as $chunk) {
    // count number of occurences of 1 and 0
    $countedValues = array_count_values($chunk);
    $cur1 = isset($countedValues[1]) ? $countedValues[1] : 0;
    $cur0 = isset($countedValues[0]) ? $countedValues[0] : 0;

    echo 'count 1 is ' . $cur1 . PHP_EOL;
    echo 'count 0 is ' . $cur0 . PHP_EOL;
    
    $max1 = max($max1, $cur1);
    $max0 = max($max0, $cur0);
}

echo '1 max count is ' . $max1 . PHP_EOL . '0 max count is ' . $max0;
7rtdyuoh

7rtdyuoh3#

我更新了chunk方法,使其简单一些,然后根据这个结果,我使用array_column()array_sum()的组合来加总每列的总数,然后您可以使用max()来查找最高值(代码中也有注解)...

$chunk  = 4;
$arr    = array('1', '1', '1', '1', '1', '1', '1', '0', '1', '0', '1', '0', '0', '0', '0', '1');

function array_chunk_vertical($arr, $percolnum){
    $re = [];
    foreach ( $arr as $number => $value )   {
        // Use modulus % to put value in correct column
        $re [$number % $percolnum][] = $value;
    }
    return $re;
}
$result = array_chunk_vertical($arr, $chunk);

$count = [];
// Loop over first row of output
foreach($result[0]  as $column => $row){
    // Sum up the results of taking all the column values for this column
    $count[$column] = array_sum(array_column($result, $column));
}
// Extract highest
$highest = max($count);
// Find highest and output which one it is.
echo $highest ." in ". (array_search($highest, $count)+1);

导致

4 in 1
pcrecxhr

pcrecxhr4#

通过修改最后一个foreach循环,可以对列10进行计数,如下所示

$columns = array();
 foreach($result  as $row){
   foreach($row as $key => $val){
    $columns[$key][] = $val;
    if($val == "1"){
        $new++;
    }
    else{
        $exist++;
    }
        echo $val;          
   }
  echo '<br/>';
 }

$cols = array_map(function($v){
   $temp = array_count_values($v);
   return 'Element :'.array_keys($temp, max($temp))[0].' came '.max($temp).' times.';
 }, $columns);

echo '<pre>';
print_r($cols);

结果

Array
(
 [0] => Element :1 came 4 times.
 [1] => Element :1 came 3 times.
 [2] => Element :1 came 2 times.
 [3] => Element :0 came 3 times.
)

相关问题