2016-02-26 23 views
2

我可能[超]超過這個。我試圖分析數組[1,9],[4,6] [5,5],[6,4],[9,1]和重複數字(我有一個超級腦放屁,甚至無法記住像這樣的數字這個詞)刪除(最後兩個),以便只打印[1,9],[4,6] [5,5]。PHP:從數組中取出重複的數字然後將它們打印出來

我在想,把這個數組變成一個字符串,並使用preg_match,但我敢肯定,即使我有正確的正則表達式這不會工作。

+1

如果你總是有這個順序的項目,你可以採取數組的前半部+1。你在考慮* palindrom *嗎? –

+0

'unset(sizeof($ array));'? – Derek

+0

輸入是靜態的嗎?它會一直有5件物品嗎? –

回答

1

它看起來像元素是對稱分佈的。

我們可以減少陣列中的兩半,並與array_slice()只得到上半場:

$array = array(
    array(1,9), 
    array(4,6), 
    array(5,5), 
    array(6,4), 
    array(9,1), 
); 
print_r(array_slice($array, 0, ceil(count($array)/2))); 

結果:

Array(
    [0] => Array(
     [0] => 1 
     [1] => 9 
    ) 
    [1] => Array(
     [0] => 4 
     [1] => 6 
    ) 
    [2] => Array(
     [0] => 5 
     [1] => 5 
    ) 
) 

Demo at Codepad

ceil()用於將數字四捨五入到下一個最高整數,如果數組中有偶數個項目。例如:如果數組中有3個項目,則5/2將返回2.5,我們需要3個項目,因此我們使用ceil(2.5),它給出3

與3項示例:

$array = array(
    array(1,9), 
    array(5,5), 
    array(9,1), 
); 
print_r(array_slice($array, 0, ceil(count($array)/2))); 

結果:

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

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

與4項示例:

$array = array(
    array(1,9), 
    array(7,7), 
    array(7,7), 
    array(9,1), 
); 
print_r(array_slice($array, 0, ceil(count($array)/2))); 

結果:

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

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

我認爲OP想要動態檢測重複項不會刪除最後2個元素 – sam12

+0

它沒有留下任何增長空間。如果您認爲它將始終如一,如果您決定添加更多,會發生什麼情況?現在你必須回到代碼並重新編碼你應該首先編碼的東西。 – Derek

+0

@OliverQueen如果OP解釋分發可能是不對稱的,則此解決方案將不起作用,因爲現在它是一個有效的解決方案。 –

1

如果我在理解你想要做的事情時是正確的,你想從數組中刪除最後2個元素?

在PHP中有一個函數array_pop,它從數組中刪除最後一個元素。

$array = array_pop($array); 

所以如果你運行這兩次,你會從數組中刪除最後2個元素。

+1

你理解錯誤的問題...... –

+1

不......即使這兩個元素*發生*是重複的,op真的要刪除*重複*,而不是最後兩個條目。 –

+0

是的,我希望它是那麼簡單的T-T。 –

1

這是我會做(我希望我得太多沒有這個:))

$stringArray = array(); 
$stringArray[] = '1,9'; 
$stringArray[] = '4,6'; 
$stringArray[] = '5,5'; 
$stringArray[] = '6,4'; 
$stringArray[] = '9,1'; 

foreach($stringArray as &$numString) { 
    $numString = explode(',', $numString); 
    usort($numString, function($a, $b) {return $a - $b;}); 
    $numString = implode(',', $numString); 
} 


$a = array_unique($a); 

print_r($a); 

你基本上每個元素爆發成一個子陣,排序,然後爆了回去。在調用array_unique之後,您將在數組中留下唯一的值。

輸出將

Array 
(
    [0] => 1,9 
    [1] => 4,6 
    [2] => 5,5 
) 
1

你建議治療[A,B]等同於[B,A]這使得問題複雜得多的結果。下面的代碼給你要的結果,但並沒有真正理解這個問題是什麼,你正在試圖修復和[1,9]是否等效於溶液中的[9,1]:

$a=array(array(1,9),array(4,6),... 
$dup=array(); 
for ($i=0; $i<count($a) -1; $i++) { 
    for ($j=$i+1; $j<count($a); $j++) { 
     if (($a[$i][0]==$a[$j[0] && $a[$i][1]==$a[$j[1]) 
     || ($a[$i][0]==$a[$j[1] && $a[$i][1]==$a[$j[0])) { 
      $dup[]=$j; 
     } 
    } 
} 
foreach ($dup as $i) { 
    unset($a[$i]); 
} 
+0

繁榮。如果我可以建議,爲什麼不直接在'if()'語句中刪除呢? – Derek

+0

因爲這會創建空值,它將匹配較早的[0,0],除非用===替換==。我以簡潔爲目標,力求透明。 – symcbean

3

如果你對這樣的數組:

$x = array(
    array(1,9), 
    array(4,6), 
    array(5,5), 
    array(6,4), 
    array(9,1) 
); 

這裏是獲得唯一對一個辦法:

foreach ($x as $pair) { 
    sort($pair); 
    $unique_pairs[implode(',', $pair)] = $pair; 
} 

此使用每個分類對作爲新數組的鍵的字符串表示,所以結果w根據定義,病人有不同的價值。

至於你的問題打印出來一部分,一旦你有獨特的價值,你可以遍歷他們並打印出來在你喜歡的任何格式,例如:

foreach ($unique_pairs as $pair) { vprintf("[%d,%d]<br>", $pair); } 
+2

這是更清潔,然後重型其他答案。 –

0

所以我m實際上會假設你的問題與其他人有不同的意義。我相信你問的是:

如何篩選出已使用項目反轉的數組項目?

<?php 
// The example set you gave 
$numberSets = [[1, 9], [4, 6], [5, 5], [6, 4], [9, 1]]; 

// Initialize an empty array to keep track of what we've seen 
$keys = []; 

// We use array filter to get rid of items we don't want 
// (Notice that we use & on $keys, so that we can update the variable in the global scope) 
$numberSets = array_filter($numberSets, function($set) use(&$keys) { 
    // Reverse the array 
    $set = array_reverse($set); 

    // Create a string of the items 
    $key = implode('', $set); 

    // Get the reverse of the numbers 
    $reversedKey = strrev($key); 

    // If the palindrome of our string was used, return false to filter 
    if (isset($keys[$reversedKey])) { 
     return false; 
    } 

    // Set the key so it's not used again 
    // Since $keys is being passed by reference it is updated in global scope 
    $keys[$key] = true; 

    // Return true to NOT filter this item, since it or it's reverse were not matched 
    return true; 

}); 

var_dump($numberSets); 
相關問題