2016-03-02 42 views
1

我正在輸出座標列表,並且我想自動突出顯示重複座標的存在。突出顯示並隱藏多維數組中的重複值

<?php 

$coords = array(
    "7" => array(
     "x" => array("0" => "395"), 
     "y" => array("0" => "81"), 
     "z" => array("0" => "17") 
    ), 
    "14" => array(
     "x" => Array("0" => "115","1" => "531"), 
     "y" => Array("0" => "47","1" => "402"), 
     "z" => Array("0" => "21","1" => "18") 
    ), 
    "15" => array(
     "x" => array("0" => "528","1" => "3","2" => "531"), 
     "y" => array("0" => "207","1" => "162","2" => "402"), 
     "z" => array("0" => "24","1" => "25","2" => "18") 
    ) 
); 

foreach ($coords as $index => $xyz){ 

} 
?> 

這是數組的樣子。 您會注意到某些位置的座標可能會重複(例如,編號爲#14#15)。

因此,重複需要匹配座標x/y/z,但不是id。

我無法弄清楚如何獲得數組的值如下,並隱藏重複:

7: 395x81x17 
14: 115x47x21 
14,15: 531x402x18 
15: 528x207x24 
15: 3x162x25 
+1

你試過了什麼?/ – Drudge

+0

你的數據的形狀不好。 '$ coords = [「14」=> [[115,47,21],[531,402,18]],「15」=> [...],...]要好得多。 – naomik

回答

0

爲什麼不只是讓那種倒排索引?像

$inverted_index = []; 
foreach ($coords as $index => $xyz){ 
    for($i = 0; $i < count($xyz['x']); $i++) { 
     $hash = sprintf('%sx%sx%s', $xyz['x'][$i], $xyz['y'][$i], $xyz['z'][$i]); 
     if(!isset($inverted_index[$hash])) { 
      $inverted_index[$hash] = []; 
     } 
     $inverted_index[$hash][] = $index; 
    } 
} 

至於導致你會得到$inverted_index可以用來顯示你想獲得

foreach ($inverted_index as $coords => $index){ 
    printf("%s: %s\n", implode(',', $index), $coords); 
} 

或者只是訪問所有座標點以簡單的$inverted_index[sprintf('%sx%sx%s', $x, $y, $z)]什麼。

該解決方案不是內存友好的,每次構建索引都不是好主意,但這看起來很容易實現和使用。

+0

謝謝,這是我一直在尋找的解決方案。當然,它需要改進,但你已經幫助我取得成果。 –