2017-04-21 74 views
-4

我有一個像這樣的下面的PHP數組 我想刪除彼此太靠近的密鑰,同時保留其中最有價值的密鑰。過濾陣列刪除類似的鍵

因此,例如,在以下3個條目中,我想保留165,並取消其他兩個。

[163] => 13 
[165] => 15 
[166] => 14 

同樣,在接下來的對,我想保持172和刪除其他

[169] => 17 
[170] => 17 
[172] => 19 
[174] => 14 

我的數組是這樣的:

Array(
    [163] => 13 
    [165] => 15 
    [166] => 14 
    [169] => 17 
    [170] => 17 
    [172] => 19 
    [174] => 14 
    [206] => 10 
    [216] => 13 
    [218] => 15 
    [220] => 14 
    [228] => 15 
    [230] => 18 
    [231] => 16 
    [234] => 13 
    [237] => 10 
    [245] => 10 
    [248] => 12 
    [251] => 15 
    [254] => 13 
    [256] => 14 
    [260] => 15 
    [262] => 17 
    [264] => 17 
    [266] => 16 
    [268] => 14 
    [271] => 11 
) 
+3

您需要定義「太靠近對方」 – billyonecan

+0

什麼太接近?它取決於數值,還是取決於數組中的位置? –

+0

目前尚不清楚你的標準是什麼。什麼是「相似」?什麼是「彼此太接近」? – alanlittle

回答

0

有些事情可以做證明。

<?php 
$a = array(
    '163' => '13', 
    '165' => '15', 
    '166' => '14', 
    '169' => '17', 
    '170' => '17', 
    '172' => '19', 
    '174' => '14', 
    '206' => '10', 
    '216' => '13', 
    '218' => '15', 
    '220' => '14', 
    '228' => '15', 
    '230' => '18', 
    '231' => '16', 
    '234' => '13', 
    '237' => '10', 
    '245' => '10', 
    '248' => '12', 
    '251' => '15', 
    '254' => '13', 
    '256' => '14', 
    '260' => '15', 
    '262' => '17', 
    '264' => '17', 
    '266' => '16', 
    '268' => '14', 
    '271' => '11' 
); 
// arsort($a); // sort by value desc 
krsort($a); // sort by key desc 
echo "startet with … "; 
print_r($a); 
$d = 0.05; //distance of 5% 
$m = false; //flag for first key unset 
foreach($a as $k => $v) { 
    if ($m === false) { // first key will be max one 
     $m = $k; 
    } 
    else if(($m - $k) < ($d * $m)) { //comparison for range = $r = $d*$m; //set absolute range for dropping elms 
     unset($a[$k]);//drop an entry 
    } else { 
     $m = $k;//set new/lower max for comparison 
    } 
} 
echo "endet up with … "; 
print_r($a); 
?> 

如果你有更精確的標準,可以幫助做你想要的選擇。

+0

您好先生,我會盡力解釋更多。如果你看看陣列,你會看到163,165,166號碼是相互接近的數字,大概有5%左右的差異。同樣,數字170,172,174彼此非常接近。我想將這些密鑰合併成一個密鑰,可能是具有最高值的那個密鑰......類似於172的值是19,這是該對中最高的密鑰。謝謝:) –

+0

當你查看排序數組時,你會在http://php.net/manual/de/array.sorting.php上找到其他方法的'arsort' - 這樣你就可以按鍵排序並使用你的自己的規則。 – vv01f

+0

在鏈接的文檔中它是'krsort'用於按鍵而不是值排序desc。改變了這個問題的代碼... – vv01f