Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 获取整行的总和,对角线&;二维数组中的整列_Php_Arrays - Fatal编程技术网

Php 获取整行的总和,对角线&;二维数组中的整列

Php 获取整行的总和,对角线&;二维数组中的整列,php,arrays,Php,Arrays,我的二维数组如下所示: 0 1 2 3 4 5 6 7 ------------------ 0| 0 0 0 0 0 0 0 0 1| 0 0 1 0 0 0 0 0 <-- Sum of this Row is 1 2| 0 0 0 0 0 0 0 0 3| 0 0 0 0 0 0 0 0 4| 0 0 0 0 0 0 0 0 5| 0 0 0 0 0 0 0 0 6| 0 0 0 0 0 0 0 0 <-- Sum o

我的二维数组如下所示:

      0 1 2 3 4 5 6 7
   ------------------
   0| 0 0 0 0 0 0 0 0
   1| 0 0 1 0 0 0 0 0 <-- Sum of this Row is 1
   2| 0 0 0 0 0 0 0 0
   3| 0 0 0 0 0 0 0 0
   4| 0 0 0 0 0 0 0 0
   5| 0 0 0 0 0 0 0 0
   6| 0 0 0 0 0 0 0 0 <-- Sum of this diagonal row is also 1
   7| 0 0 0 0 0 0 0 0 
          ^ Sum of this column is also 1
但我不知道如何在不做循环的情况下得到列或对角线的和。我知道我需要使用循环来获得对角线的和,但是有没有一种方法可以在没有循环的情况下获得列的和呢?还是尽可能高效

 $sumCol  = array_sum($board[][2]); //Something like this
 $sumDiag = ?
只需尝试(PHP>=5.5.0):

对于对角线和,使用:

$subDiag = array_sum( array_map(function($row, $index){
  return $row[$index];
}, $board, array_keys($board)) );
只需尝试(PHP>=5.5.0):

对于对角线和,使用:

$subDiag = array_sum( array_map(function($row, $index){
  return $row[$index];
}, $board, array_keys($board)) );

如何获取行、列和对角线之和的示例。其思想是像以下示例中那样拆分阵列:

diagonal +1 diagonal -2 0 |0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |0 1 0 0 0 0 0 _0_0_1_0_0_0 0 0 0 |0 0 0 0 0 0 0 0 0 0 0 0 0| 0 0 0 |0 0 0 0 0 0 0 0 0 0 0 0 0| 0 0 0 |0 0 0 0 0 0 0 0 0 0 0 0 0| 0 0 0 |0 0 0 0 0 0 0 0 0 0 0 0 0| 0 0 0 |0_0_0_0_0_0_0_ 0 0 0 0 0 0| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0| 0 0 对角线+1对角线-2 0 |0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |0 1 0 0 0 0 0 _0_0_1_0_0_0 0 0 0 |0 0 0 0 0 0 0 0 0 0 0 0 0| 0 0 0 |0 0 0 0 0 0 0 0 0 0 0 0 0| 0 0 0 |0 0 0 0 0 0 0 0 0 0 0 0 0| 0 0 0 |0 0 0 0 0 0 0 0 0 0 0 0 0| 0 0 0 |0_0_0_0_0_0_0_ 0 0 0 0 0 0| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0| 0 0 这种方法很容易通过简单的数组_walk获得任何对角线的对角线和:

$row_sum = function( $array, $row ) { 
    return array_sum( $array[$row] ); 
};

$column_sum = function( $array, $column ) {     
    return array_reduce( $array, function( $r, $i ) use ( $column ) {
        return $r += $i[$column];       
    });
};

/**
 * @param int $diagonal ( positive and negative )
 */
$diagonal_sum = function( $array, $diagonal ) {

    $slice = array_map( function($i) use ($diagonal) {
        return $diagonal < 0 ? array_slice($i, 0, $diagonal) : array_slice($i, $diagonal);  
    }, $diagonal > 0 ? array_slice($array, 0, -$diagonal) : array_slice($array, abs($diagonal)));

    array_walk( $slice, function( &$item, $key ) {
        $item = $item[$key];
    });

    return array_sum( $slice ); 
};


$array = array_map( function() { return array_fill( 0, 8, 0 ); }, array_fill( 0, 8, 0 ) );
$array[1][2] = 1;

echo $row_sum( $array, 1 ); 
echo $column_sum( $array, 2 );  
echo $diagonal_sum( $array, 1 );
$row\u sum=函数($array,$row){
返回数组_和($array[$row]);
};
$column_sum=函数($array,$column){
返回数组\u reduce($array,function($r,$i)use($column){
返回$r+=$i[$column];
});
};
/**
*@param int$对角线(正和负)
*/
$diagonal\u sum=函数($array,$diagonal){
$slice=数组\映射(函数($i)使用($对角线){
返回$diagonal<0?数组切分($i,0,$diagonal):数组切分($i,$diagonal);
},$diagonal>0?数组切分($array,0,-$diagonal):数组切分($array,abs($diagonal));
数组_walk($slice,function(&$item,$key){
$item=$item[$key];
});
返回数组和($slice);
};
$array=array_-map(函数(){returnarray_-fill(0,8,0);},array_-fill(0,8,0));
$array[1][2]=1;
echo$row_sum($array,1);
echo$column_sum($array,2);
echo$对角线和($array,1);

如何获取行、列和对角线之和的示例。其思想是像以下示例中那样拆分阵列:

diagonal +1 diagonal -2 0 |0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |0 1 0 0 0 0 0 _0_0_1_0_0_0 0 0 0 |0 0 0 0 0 0 0 0 0 0 0 0 0| 0 0 0 |0 0 0 0 0 0 0 0 0 0 0 0 0| 0 0 0 |0 0 0 0 0 0 0 0 0 0 0 0 0| 0 0 0 |0 0 0 0 0 0 0 0 0 0 0 0 0| 0 0 0 |0_0_0_0_0_0_0_ 0 0 0 0 0 0| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0| 0 0 对角线+1对角线-2 0 |0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |0 1 0 0 0 0 0 _0_0_1_0_0_0 0 0 0 |0 0 0 0 0 0 0 0 0 0 0 0 0| 0 0 0 |0 0 0 0 0 0 0 0 0 0 0 0 0| 0 0 0 |0 0 0 0 0 0 0 0 0 0 0 0 0| 0 0 0 |0 0 0 0 0 0 0 0 0 0 0 0 0| 0 0 0 |0_0_0_0_0_0_0_ 0 0 0 0 0 0| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0| 0 0 这种方法很容易通过简单的数组_walk获得任何对角线的对角线和:

$row_sum = function( $array, $row ) { 
    return array_sum( $array[$row] ); 
};

$column_sum = function( $array, $column ) {     
    return array_reduce( $array, function( $r, $i ) use ( $column ) {
        return $r += $i[$column];       
    });
};

/**
 * @param int $diagonal ( positive and negative )
 */
$diagonal_sum = function( $array, $diagonal ) {

    $slice = array_map( function($i) use ($diagonal) {
        return $diagonal < 0 ? array_slice($i, 0, $diagonal) : array_slice($i, $diagonal);  
    }, $diagonal > 0 ? array_slice($array, 0, -$diagonal) : array_slice($array, abs($diagonal)));

    array_walk( $slice, function( &$item, $key ) {
        $item = $item[$key];
    });

    return array_sum( $slice ); 
};


$array = array_map( function() { return array_fill( 0, 8, 0 ); }, array_fill( 0, 8, 0 ) );
$array[1][2] = 1;

echo $row_sum( $array, 1 ); 
echo $column_sum( $array, 2 );  
echo $diagonal_sum( $array, 1 );
$row\u sum=函数($array,$row){
返回数组_和($array[$row]);
};
$column_sum=函数($array,$column){
返回数组\u reduce($array,function($r,$i)use($column){
返回$r+=$i[$column];
});
};
/**
*@param int$对角线(正和负)
*/
$diagonal\u sum=函数($array,$diagonal){
$slice=数组\映射(函数($i)使用($对角线){
返回$diagonal<0?数组切分($i,0,$diagonal):数组切分($i,$diagonal);
},$diagonal>0?数组切分($array,0,-$diagonal):数组切分($array,abs($diagonal));
数组_walk($slice,function(&$item,$key){
$item=$item[$key];
});
返回数组和($slice);
};
$array=array_-map(函数(){returnarray_-fill(0,8,0);},array_-fill(0,8,0));
$array[1][2]=1;
echo$row_sum($array,1);
echo$column_sum($array,2);
echo$对角线和($array,1);

您可以尝试一下,将这个数组粘贴到一个类中,并创建方法来设置位置,为代表总和的每一行保留一个变量,当设置单元格时,您只需要用该行的总和计算新设置的值(也是对角线),当请求一个总和值时,执行时间将为Θ(1)。只有在创建gameboard并检查每一行时,才有Θ(n)。但是内存使用会因此而增加。你可以尝试一下,将这个数组粘贴到一个类中,并创建方法来设置位置,为每一行保留一个表示和的变量,当设置一个单元格时,你只需要用该行的和来计算新设置的值(也是对角线),请求求和值时,执行时间为Θ(1)。只有在创建gameboard并检查每一行时,才有Θ(n)。但是内存使用率会因此而增加。太棒了,非常感谢这项工作。现在我只需要找到一种方法来做对角线sumFYI,一个用于5.1.0-5.4.29的
array\u column()
解决方案:(我没有写它,但做了一个快速测试)@hsz我认为对角线不起作用,我只是检查并返回了0。我试过的
$board[2][3]
@GGio对角线是:[
board[0][0]
board[1][1]
,…,
board[7][7]
]-不是吗?@hsz不仅仅是,从任何一个对角线开始。所以基本目标是在任何对角线、任何行或任何列中不能有多个
1
。行/列现在可以工作了,我需要对角线。我试图用稍微不同的方法来解决8皇后之谜。太棒了,非常感谢你的帮助。现在我只需要找到一种方法来做对角线sumFYI,一个用于5.1.0-5.4.29的
array\u column()
解决方案:(我没有写它,但做了一个快速测试)@hsz我认为对角线不起作用,我只是检查并返回了0。我试过的
$board[2][3]
@GGio对角线是:[
board[0][0]
board[1][1]
,…,
board[7][7]
]-不是吗?@hsz不仅仅是,从任何一个对角线开始。所以基本目标是在任何对角线、任何行或任何列中不能有多个
1
。行/列现在可以工作了,我需要对角线。我试着用稍微不同的方法解决8皇后难题。