2014-06-30 69 views
0

我有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'); 

當然,在現實情況下,更擴大。

在此先感謝。

+1

這可能只是我,但我不明白的要求 – asprin

+1

這是你的矩陣,它是一個數組嗎?這是一個帶換行符的單個字符串嗎?什麼是輸入類型 - 這將在解決方案中發揮重要作用。 – Fluffeh

+0

@asprin基於輸出,它似乎是對輸入中數字1的協調參照。如果輸入是一個二維數組,那麼數字索引中包含1。 – Fluffeh

回答

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); 
+0

謝謝,但在這個例子中,我得到一個數組與7元素。它應該是兩個具有6和1個元素的數組 – user2807217

+0

然後解釋給出這兩個數組的背後邏輯:它們之間有什麼區別?爲什麼一個數組有6個條目,另一個只有1個?你如何決定是將一個島放在一個陣列還是另一個島? –

+0

http://s15.postimg.org/xymc48lbb/tablica.jpg - 島嶼是由0個元素或陣列邊緣包圍的1個元素組成的羣組 - 紅色島嶼和綠色島嶼 – user2807217

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' 
) 
+0

謝謝,它不完全是我的意思:) – user2807217