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

我有这样的数组


$chunk = 4; 



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



我根据 $chunk 将这个数组修改成行和列。 在这个例子中,它将是4 x4行和列。

我想要做的是如何计算每列中的'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/>';


}



时间:


$chunk = 4; 


$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;



我更新了块方法以简化它,然后从这个结果中使用 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



 

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


$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


)



演示工具

你可以通过修改最后一个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.


)



...