2015-03-19 66 views
0

我有這個(貌似)簡單的PHP問題:
我有一個關聯數組(這反映了一個數據庫表的結構,但是這是不相關的,在這裏),像這樣的:PHP:如何將關聯數組的每個關鍵字與其他關鍵字進行比較,跳過排列?

---------------------------------- 
id | name   | phone 
---------------------------------- 
    1 | alice   | 12345678 
    3 | bob    | 56789012 
    9 | zorro   | 9
... | ...    | ... 
---------------------------------- 

我需要遍歷數組來比較(比如檢查沒有兩個人具有相同的電話號碼)每個密鑰與其他所有其他密鑰,避免重複像check(1,3)和check(3,1)...(我想我可以從等效的數學概念中命名這些duplications)。

<?php 
    $table = [ 
    [ 
     "id" => "1", 
     "name" => "alice", 
     "phone" => "12345678", 
    ], [ 
    [ 
     "id" => "3", 
     "name" => "bob", 
     "phone" => "56789012", 
    ], [ 
    [ 
     "id" => "9", 
     "name" => "zorro", 
     "phone" => "9", 
    ], 
    ]; 
?> 

這就是我想:

<?php 
    foreach ($table as $record1) { 
    foreach ($table as $record2) { 
     check($record1["phone"], $record2["phone"]); 
    } 
    } 
?> 

不過,當然這個重複檢查...
通常(在C language,例如),我會依次遍歷數組thorugh,從外部循環的當前索引旁邊的索引處開始內部循環...但是在PHP中,我被告知我不能順序遍歷一個關聯數組... :-(

所以這個問題是:如何通過PHP關聯數組迭代以將函數應用於任意幾個鍵,從而避免排列?

+0

索引是數字的,但也可以是不連續的:我可以公頃我有一個非常**的「稀疏」表... – MarcoS 2015-03-19 09:43:01

回答

1

你可以做到這一點,就像在C:

$len = count($table); 
for($i = 0; $i < $len - 1; $i++) 
    for($j = $i + 1; $j < $len; $j++) 
     compare table[$i] and table[$j] 

如果你的鍵不連續,重複按鍵陣列上(這是連續的),而不是實際的數組:

$keys = array_keys($table); 
$len = count($keys); 
for($i = 0; $i < $len - 1; $i++) 
    for($j = $i + 1; $j < $len; $j++) 
     compare table[keys[$i]] and table[keys[$j]] 
+0

索引是數字,但可能不連續:我可以有一個**非常**「稀疏」表... – MarcoS 2015-03-19 09:43:39

+0

@MarcoS:更新 – georg 2015-03-19 09:44:56

+0

Yessss ...我喜歡這個想法... :-)(您的解決方案是第一個候選人接受... :-) – MarcoS 2015-03-19 09:46:34

0

您可以使用in_array此:

foreach ($table as $record1) { 
    if(in_array($record1["phone"], $table){ 

    } 
} 

此檢查,如果當前值出現在數組中。在這裏閱讀更多:http://php.net/manual/en/function.in-array.php

+0

不好意思,但是這個解決方案確實*不*避免排列檢查... – MarcoS 2015-03-19 09:31:05

0

試試這個:)

<?php 

$data = array(
    array('id'=>'1','name'=>'test1','phone'=>'1231231234'), 
    array('id'=>'2','name'=>'test2','phone'=>'1231231235'), 
    array('id'=>'3','name'=>'test2','phone'=>'1231231234') 
); 

// sort and find duplicate numbers 
$ch = array(); 
$duplicate = array(); 
foreach($data as $k=>$d){ 
    if(in_array($d['phone'],$ch)){ 
     $duplicate[] = $k; 
    }else{ 
     $ch[$k]=$d['phone']; 
    } 
} 
// remove duplicated numbers from the initial table array 
if($duplicate){ 
    foreach($duplicate as $r) 
     unset($data[$r]); 
} 
// now we have only unique numbers 
echo '<pre>'; 
print_r($data); 
echo '</pre>'; 
+0

對不起,但是這個解決方案不會*避免排列檢查... – MarcoS 2015-03-19 09:45:43

相關問題