Php数组获取所有重复的值

Php数组获取所有重复的值,php,arrays,Php,Arrays,我有一个Php数组,它的时间值作为数组值,时间戳作为键数组,如下所示: array( 144454884=>"12:00am", 145454884=>"12:30am", 144474884=>"1:00am", 144454864=>"1:30am", 143354884=>"1:00am", 144654884=>"1:30am", 1444567584=>"2:00am " ); 上面例子中的时间戳值是不真实的,我写了一个

我有一个Php数组,它的时间值作为数组值,时间戳作为键数组,如下所示:

 array(
      144454884=>"12:00am", 145454884=>"12:30am", 144474884=>"1:00am", 144454864=>"1:30am", 143354884=>"1:00am", 144654884=>"1:30am", 1444567584=>"2:00am "
    );
上面例子中的时间戳值是不真实的,我写了一个例子,它们毫无用处,除非你的时区和我的时区匹配

问题: 我需要得到“1:00am”和“1:30am”两次,我可以得到重复值1次,如回答所示:

我需要将两个值重复两次,同时重复键和值,因为我需要从系统上的周时间中删除这些时间戳,因为夏令时正在重复一个时间,我根本不想显示凌晨1:00,我只想显示此时间不可用。

此代码有效:

<?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>';

保留关键信息的可能解决方案(我会将中间结果分配给它们自己的变量,否则读取时可能会混淆)

将导致:

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"
}

我不是100%确定你想要什么,但这是我认为你需要的。 假设您的输入数组被称为
$a

$b
将包含一个唯一值数组。
$c
将包含已删除的元素

$b
$c
的结果如下:


数组中不能有重复的键。。。。数组键必须是唯一的。。。。引用:
如果数组声明中的多个元素使用相同的键,只有最后一个会被使用,因为所有其他的都会被覆盖。
我认为如果源代码使用utc时间,然后使用php datetime类转换回您的时间,那么您就不需要处理日光/叶年。我有一个复杂的函数,包含utc时间数组。Andrew在我的服务器时间中,在显示用户的时区。标记是我没有重复的键我有重复的值这两次的时间戳不同,但由于夏令时时钟在2015年10月25日凌晨1:00倒带到英国,所以凌晨1:00和凌晨1:30出现两次,请检查这里,我知道时间变化。。。。结果我多睡了几个小时
我需要两个重复值,两个键和值都重复两次
听起来好像你想让多个值使用同一个键(
重复
)是的,代码可以工作。你能用一些注释解释一下吗?你能用我的数组作为例子吗。需要知道这是为什么。感谢我能够用这段代码解决这个问题,这段代码丢失了密钥信息,虽然我想保留密钥,但它起到了作用。如果您稍微扩展此代码段,您可以保存“密钥信息”和“表示”。是的,谢谢array_flip()两次应该可以做到这一点,它应该给我唯一的值删除重复的1:00am,并保留关键点。这很有效。
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"
}
$b = array_flip(array_flip($a));
$c = array_diff_key($a, $b);
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"
}