【问题标题】:Search a multidimensional array for duplicates and return duplicate values and array key在多维数组中搜索重复项并返回重复值和数组键
【发布时间】:2016-05-04 17:28:58
【问题描述】:

我有以下多维数组:

$ancestors = array(
[1] =>array("Andrew","Adele"), 
[2] =>array("Bertha","Bill","Billy","Blake"), 
[3] =>array("Cathy","Case","Cory","Creek","Andrew","Ceaser","Cece","Childer"));

我正在尝试搜索行并返回重复值以及重复出现的最小数字的数组键并将值返回到关联数组:

$common = array("Andrew"=>"1");

【问题讨论】:

  • 同一个子数组中可以有重复吗?
  • 子数组中不应有重复项。我尝试了几种不同的编码方法,但我似乎找不到任何有效的方法。我尝试了嵌套的 foreach 语句,但失败了。
  • 如果“Bill”是重复的,结果数组中的值是多少?
  • "Bill =>" 不管他第一次出现在哪一代"

标签: php arrays multidimensional-array duplicates


【解决方案1】:
// merge all array in one
$new = array();
foreach($ancestors as $i)
   $new = array_merge($new, $i);

// make array value => count and sort in in descendant order
$ar = array_count_values($new);
arsort($ar);

// save result array while count > 1
$result = array();
foreach($ar as $k => $v) {
  if ($v < 2) break;
  $result[$k] = array_search($k, $new) + 1;
}

print_r($result);

【讨论】:

    【解决方案2】:

    我们必须将每一行与后面的行进行比较,因此第 1 行与第 2 行和第 3 行,第 2 行与第 3 行,第 3 行没有任何内容(已经比较过)。 为此,我们使用 base-1 for 循环遍历除最后一个之外的所有 $ancestors 元素,然后将每个名称与更大的祖先进行比较:

    $result = array();
    /* Loop count($ancestors) -1: */
    for( $i = 1; $i<count( $ancestors ); $i++ )
    {
        /* Loop for each name: */
        foreach( current( $ancestors ) as $val )
        {
            /* If name is already in result, skip: */
            if( isset( $result[$val] ) ) continue;
            /* Loop for each following ancestors: */
            foreach( array_slice( $ancestors, $i, Null, True ) as $key => $row )
            {
                if( in_array( $val, $row ) ) $result[ $val ] = key( $ancestors );
            }
        }
        next( $ancestors );
    }
    

    为此$ancestors

    $ancestors = array(
        1 =>array( "Andrew","Adele" ), 
        2 =>array( "Bertha","Bill","Billy","Blake","Adele" ), 
        3 =>array( "Cathy","Case","Cory","Creek","Andrew","Ceaser","Bill","Cece","Childer" ),
        4 =>array( "Cathy" )
    );
    

    结果是:

    Array
    (
        [Andrew] => 1
        [Adele] => 1
        [Bill] => 2
        [Cathy] => 3
    )
    

    【讨论】:

      【解决方案3】:

      首先将所有名称组合成一个数组,名称为键,生成索引的数组为值:

      foreach ($ancestors as $generation_key => $generation) {
          foreach ($generation as $name) {
              $combined[$name][] = $generation_key;
          }
      }
      

      然后将组合结果限制为具有多个名称实例的值:

      $duplicates = array_filter($combined, function($x) { return count($x) > 1; });
      

      然后使用 min 将数组转换为单个值:

      foreach ($duplicates as &$value) {
          $value = min($value);
      }
      unset($value);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-06
        • 2013-07-29
        • 2014-03-23
        • 2013-01-25
        • 1970-01-01
        • 2020-09-04
        • 1970-01-01
        相关资源
        最近更新 更多