2015-10-25 63 views
0

我有一個PHP數組,有次爲數組值和時間戳值作爲鍵部分是這樣的價值觀:在上面的例子中PHP數組獲取被重複

array(
     144454884=>"12:00am", 145454884=>"12:30am", 144474884=>"1:00am", 144454864=>"1:30am", 143354884=>"1:00am", 144654884=>"1:30am", 1444567584=>"2:00am " 
    ); 

時間戳值是不是真正的我寫的一個例子他們無用,除非你的時區符合我的要求。

問題: 我需要得到「凌晨1:00」和「凌晨1:30」兩次我可以重複值1點時,如圖答案在這裏:

php return only duplicated entries from an array

我既需要重複值重複兩次,因爲我需要從我的系統中刪除周時間的時間戳,因爲夏令時是重複的,我不想顯示上午1點我只是想顯示這一次不可用。

+1

不能有以陣列重複鍵....數組鍵必須是唯一....從[PHP文檔]引用( http://www.php.net/manual/en/language.types.array.php):'如果數組聲明中的多個元素使用同一個鍵,則只有最後一個元素被使用,因爲所有其他元素都被覆蓋。 –

+0

我認爲如果你的源使用utc時間,然後使用php datetime類轉換回你的時間,那麼你不需要處理日光/葉年 – Andrew

+0

我有一個複雜的函數與UTC陣列的一天中的時間安德魯在我的服務器發生此問題的同時顯示用戶的時區。 –

回答

1

我不是100%確定你想要什麼,但這是我第你需要的墨水。 假設你的輸入數組稱爲$a

$b = array_flip(array_flip($a)); 
$c = array_diff_key($a, $b); 

$b將包含唯一值的陣列。 $c將包含已刪除的元素。是$b$c

結果如下:

array(5) { 
    [144454884] = string(7) "12:00am" 
    [145454884] = string(7) "12:30am" 
    [143354884] = string(6) "1:00am" 
    [144654884] = string(6) "1:30am" 
    [1444567584] = string(7) "2:00am " 
} 

array(2) { 
    [144474884] = string(6) "1:00am" 
    [144454864] = string(6) "1:30am" 
} 
+0

是的感謝array_flip()兩次應該做的伎倆,它應該給我獨特的價值取消重複1:00上午,並保持鍵。這工作。 –

1

此代碼:

<?php 
$array_new = []; 
$array_tmp = []; 
$array = array(1=>'1233',2=>'12334',3 =>'Hello' ,4=>'hello', 5=>'U'); 

//loop trough all elements in array and for ever element create key 
//For "world" key is "world" 
//For "World" key is "world" 
//For "WORLD" key is "world" 
//So all this cases have same key and differenet representation eg. "world" => ["world","World","WORLD"] 
foreach($array as $k => $v){ 
    $index = strtolower($v); 
    $array_tmp[$index][] = $v; 
} 

//loop trough new array with new keys and if there are more than one element(> 1) for some key, all of his representations put in new array 
foreach($array_tmp as $k => $v){ 
    if(count($v) > 1){ 
     foreach($v as $k2 => $v2){ 
      $array_new[] = $v2; 
     } 
    } 
} 

echo '<pre>'; 
print_r($array_new); 
echo '<pre>'; 
+0

是的代碼作品可以請你解釋一下有一些評論和你能用我的數組作爲例子,我需要理解和使用這個。需要知道爲什麼這是工作。 –

+0

我編輯過的帖子(給代碼添加一些註釋)。 – fico7489

+0

謝謝我能夠用這段代碼解決這個問題,但是這段代碼丟失了關鍵信息,儘管我想保留這些關鍵信息但它有幫助。 –

0

一個可能的解決方案保持關鍵信息(我將分配中間結果自己的變量,否則可能會造成混淆閱讀)

$array = array(
    143354883 => "1:00am", 
    144454884 => "12:00am", 
    145454884 => "12:30am", 
    144474884 => "1:00am", 
    144454864 => "1:30am", 
    143354884 => "1:00am", 
    144654884 => "1:30am", 
    1444567584 => "2:00am ", 
    0 => 4, 
    1 => 4, 
    2 => 4, 
    3 => "Test", 
    4 => "TEST", 
    5 => "test " 
); 

// Used this array_iunique function: http://stackoverflow.com/questions/2276349/case-insensitive-array-unique 
function array_iunique($array) { 
    return array_intersect_key(
     $array, 
     array_unique(array_map("StrToLower",$array)) 
    ); 
} 

$unique = array_iunique($array); 

// Then get the difference by key, that will give you all the duplicate values: 
$diff_key = array_diff_key($array, $unique); 

// Now we have to find the values that are in the $diff_key and the $unique because we also want to have those: 
$correspondingValues = array_uintersect($unique, $diff_key, "strcasecmp"); 

// Then we have to combine the $duplicate values with the $diff_key and preserve the keys: 
$result = array_replace($correspondingValues, $diff_key); 
var_dump($result); 

會導致在:

array(10) { 
    [143354883]=> 
    string(6) "1:00am" 
    [144454864]=> 
    string(6) "1:30am" 
    [0]=> 
    int(4) 
    [3]=> 
    string(4) "Test" 
    [144474884]=> 
    string(6) "1:00am" 
    [143354884]=> 
    string(6) "1:00am" 
    [144654884]=> 
    string(6) "1:30am" 
    [1]=> 
    int(4) 
    [2]=> 
    int(4) 
    [4]=> 
    string(4) "TEST" 
}