获取数组中重复值的键

sch*_*nya 10 php arrays key duplicates

我有以下数组:

$myarray = Array("2011-06-21", "2011-06-22", "2011-06-22", "2011-06-23", "2011-06-23", "2011-06-24", "2011-06-24", "2011-06-25", "2011-06-25", "2011-06-26");
var_dump($myarray);
Run Code Online (Sandbox Code Playgroud)

结果:

Array (
    [0] => 2011-06-21
    [1] => 2011-06-22
    [2] => 2011-06-22
    [3] => 2011-06-23
    [4] => 2011-06-23
    [5] => 2011-06-24
    [6] => 2011-06-24
    [7] => 2011-06-25
    [8] => 2011-06-25
    [9] => 2011-06-26
)
Run Code Online (Sandbox Code Playgroud)
  1. 现在如何显示具有重复值的键?这里函数不应该返回([0],[9]),因为这些值没有重复.
  2. 如何找到相同值的键,例如 对于"2011-06-25"它应该返回[7],[8]

Tre*_*rey 22

function get_keys_for_duplicate_values($my_arr, $clean = false) {
    if ($clean) {
        return array_unique($my_arr);
    }

    $dups = $new_arr = array();
    foreach ($my_arr as $key => $val) {
      if (!isset($new_arr[$val])) {
         $new_arr[$val] = $key;
      } else {
        if (isset($dups[$val])) {
           $dups[$val][] = $key;
        } else {
           $dups[$val] = array($key);
           // Comment out the previous line, and uncomment the following line to
           // include the initial key in the dups array.
           // $dups[$val] = array($new_arr[$val], $key);
        }
      }
    }
    return $dups;
}
Run Code Online (Sandbox Code Playgroud)

显然函数名有点长;)

现在$ dups将包含一个由重复值键入的多维数组,包含每个重复的键,如果发送"true"作为第二个参数,它将返回没有重复值的原始数组.

或者,您可以将原始数组作为参考传递,并在返回重复数组时相应地调整它


Fra*_*nes 13

我先回答第二个问题.您想使用array_keys指定的"search_value".

$keys = array_keys($array, "2011-06-29")
Run Code Online (Sandbox Code Playgroud)

在下面的示例中,$duplicates将包含重复值,同时$result包含不重复的值.要获得密钥,只需使用array_keys.

<?php

$array = array(
  'a',
  'a',
  'b',
  'c',
  'd'
);

// Unique values
$unique = array_unique($array);

// Duplicates
$duplicates = array_diff_assoc($array, $unique);

// Unique values
$result = array_diff($unique, $duplicates);

// Get the unique keys
$unique_keys = array_keys($result);

// Get duplicate keys
$duplicate_keys = array_keys(array_intersect($array, $duplicates));
Run Code Online (Sandbox Code Playgroud)

结果:

// $duplicates
Array
(
    [1] => a
)

// $result
Array
(
    [2] => b
    [3] => c
    [4] => d
)

// $unique_keys
Array
(
    [0] => 2
    [1] => 3
    [2] => 4
)

// $duplicate_keys
Array
(
    [0] => 0
    [1] => 1
)
Run Code Online (Sandbox Code Playgroud)

  • @cypher - 一个简单的`array_keys(array_intersect($ array,$ duplicates))`就可以做到这一点.:) (2认同)