找出酉矩阵中的一个浓度区域

时间:2014-06-30 11:41:25

标签: php matrix

我有一些0-1元素的数组,如:

array('0,0'=>0,'1,0'=>0,'2,0'=>0,'3,0'=>1,'0,1'=>1,'1,1'=>1,'2,1'=>0,'3,1'=>0,'0,2'=>1,'1,2'=>1,'2,2'=>1,'3,2'=>1);

看起来像:

0 0 0 1
1 1 0 0
1 1 1 1 

如何查找1的所有岛屿?

在这种情况下,我想返回值:

$island[] = array('3,0');
$island[] = array('0,1','1,1','0,2','1,2','2,2','3,2');

当然,在实际案例中会有更多扩展。

提前致谢。

2 个答案:

答案 0 :(得分:0)

你可以在另一个foreach中使用foreach来搜索数组的值为1,如下所示:

<?php 
    $array=array(
    array(0,0,0,1),
    array(1,1,0,0),
    array(1,1,1,1)
    );
    $island=array();
    foreach($array as $x=>$arr)
    {
        foreach($arr as $y=>$val)
        {
            if($val==1)
            {
                $island[]=array($x, $y);
            }
        }
    }

    print_r($island);
?>

输出:

Array
(
    [0] => Array
        (
            [0] => 0
            [1] => 3
        )

    [1] => Array
        (
            [0] => 1
            [1] => 0
        )

    [2] => Array
        (
            [0] => 1
            [1] => 1
        )

    [3] => Array
        (
            [0] => 2
            [1] => 0
        )

    [4] => Array
        (
            [0] => 2
            [1] => 1
        )

    [5] => Array
        (
            [0] => 2
            [1] => 2
        )

    [6] => Array
        (
            [0] => 2
            [1] => 3
        )

)

此输出查找所有索引1并将它们作为数组中的单个条目返回。

您也可以使用:

<?php 
    $array=array(
    array(0,0,0,1),
    array(1,1,0,0),
    array(1,1,1,1)
    );
    $island=array();
    $temp=array();
    foreach($array as $x=>$arr)
    {
        foreach($arr as $y=>$val)
        {
            if($val==1)
            {
                $temp[]="'".$x.','.$y."'";
            }
        }
        if(count($temp)>0)
        {
            $island[]=implode(',',$temp);
        }
        $temp=array();
    }

    print_r($island);
?>

这将使阵列更接近您所需的输出:

Array
(
    [0] => '0,3'
    [1] => '1,0','1,1'
    [2] => '2,0','2,1','2,2','2,3'
)

答案 1 :(得分:0)

$islands = [
    [0, 0, 0, 1],
    [1, 1, 0, 0],
    [1, 1, 1, 1],
];

$result = [];
array_walk_recursive(
    $islands,
    function ($value, $key) use (&$result) {
        static $c = PHP_INT_MAX;
        static $r = -1;
        if ($c >= $key) {
            ++$r;
            $c = $key;
        }
        if ($value)
            $result[] = $key . ',' . $r;
    }
);
var_dump($result);