【问题标题】:How to remove duplicate key value array in multidimensional array如何去除多维数组中重复的键值数组
【发布时间】:2017-04-12 06:49:09
【问题描述】:

我有这个数组,如果它的值与其他数组相同,我想删除它

$appointments = array(
                      array('1','Monday', '5:30 PM'),
                      array('2','Friday', '6:00 PM'),
                      array('3','Monday', '5:30 PM'),
                      array('4','Tuesday', '4:15 PM'),
                      array('5','Wednesday', '8:30 PM'),
                      array('6','Thursday', '1:45 PM')
);

我想要这个结果星期一,时间是显示两次所以我只需要显示一次我使用下面的代码所以请为此提供更好的解决方案

$one_dimension = array_map('serialize', $appointments);
$unique_one_dimension = array_unique($one_dimension);
$unique_multi_dimension = array_map('unserialize', $unique_one_dimension);

echo "<pre>";print_r($unique_multi_dimension);

【问题讨论】:

  • 那么,您要删除/保留哪个数组?第一个矿石最后一个?哪些值在这里很重要 - 只有第二个元素或第一个和第三个元素也是重要的?
  • $appointments = array_intersect_key($appointments, array_unique(array_column($appointments, 1)));
  • 任何一个,但确保不会显示重复项
  • 我会使用数组键,请访问链接:stackoverflow.com/questions/18734844/…。如果您需要帮助,请询问
  • 你好@MarkBaker它的工作只是因为你有使用array_column但我们还必须比较价值工作日和时间

标签: php arrays sorting multidimensional-array


【解决方案1】:

PHP code demo

<?php

$appointments = array(
                      array('1','Monday', '5:30 PM'),
                      array('2','Friday', '6:00 PM'),
                      array('3','Monday', '5:30 PM'),
                      array('4','Tuesday', '4:15 PM'),
                      array('5','Wednesday', '8:30 PM'),
                      array('6','Thursday', '1:45 PM')
);
//Here we are finding column of week days.


$implodedColumns=  array_map(function($data){
    unset($data[0]);
    return implode(",", array_map('trim', $data));
}, $appointments);
$result=array_unique($implodedColumns); 

array_walk($result, function(&$value,$key){
    $value=  array_merge(array($key),  explode(",", $value));
});

print_r($result); 

输出:

Array
(
    [0] => Array
        (
            [0] => 0
            [1] => Monday
            [2] => 5:30 PM
        )

    [1] => Array
        (
            [0] => 1
            [1] => Friday
            [2] => 6:00 PM
        )

    [3] => Array
        (
            [0] => 3
            [1] => Tuesday
            [2] => 4:15 PM
        )

    [4] => Array
        (
            [0] => 4
            [1] => Wednesday
            [2] => 8:30 PM
        )

    [5] => Array
        (
            [0] => 5
            [1] => Thursday
            [2] => 1:45 PM
        )

)

【讨论】:

  • 你好,但我们不必只比较工作日,我们还必须比较工作日和时间
  • @ErNilayParekh 抱歉,这是一个错误。您可以立即查看
  • 你好@sahil-gulati 你提供的解决方案正在处理这个例子,但在我的情况下,有很多可用的列,所以我该如何比较?
  • @ErNilayParekh 你能提供那个数组的样本吗?
  • 有聊天选项吗?
【解决方案2】:
$one_dimension = array_map('serialize', $appointments);
$unique_one_dimension = array_unique($one_dimension);
$unique_multi_dimension[1] = array_map('unserialize', $unique_one_dimension);

echo "<pre>";print_r($unique_multi_dimension);die;

【讨论】:

    【解决方案3】:

    标准 O(n^2) 通用克隆解决方案:

    function array_unique_callback($array, $equalityComparer) {
        $uniqueFiltered = [];
        $keys = array_keys($array);
        for ($i = 0;$i < count($array);$i++) {
             $add = true;
             for ($j = 0;$j < $i;$j++) {
                  if ($equalityComparer($array[$keys[$i]], $array[$keys[$j]])) {
                       $add = false;
                       break;
                  }
             } 
             if ($add) { 
                 $uniqueFiltered[] = $array[$keys[$i]]; 
             }
        }
        return $uniqueFiltered;
    }
    array_unique_callback($appointments, function ($x,$y) {
         return $x[1] == $y[1] && $x[2] == $y[2];
    });
    

    示例: http://sandbox.onlinephpfunctions.com/code/8013c36b78d24f08651b05375d686c9e07c75a49

    如果您想要更优化的版本:

    function array_unique_callback($array, $comparer) {
       //Comparer is not an equality comparer, it returns negative if $x less than $y, 0 if they are equal and 1 if $x greater than $y
        $keys = array_keys($array);
        uasort($array, $comparer);
        $uniqueFiltered = [];
        for ($i = 0;$i < count($array);$i++) {
            $uniqueFiltered[$keys[$i]] = $array[$keys[$i]]; 
            while ($i < count($array) && $comparer($array[$keys[$i]],$array[$keys[$i+1]]) === 0) { $i++; }
        }
        return $uniqueFiltered;
    }
    

    但是,第二个版本需要您决定比较和排序每个元素的方法(这并不总是可行的)。

    【讨论】:

      【解决方案4】:

      @Er Nilay Parekh 您可以按照以下概念进行操作:

      <?php
        $appointments = array(
                            array('1','Monday', '5:30 PM'),
                            array('2','Friday', '6:00 PM'),
                            array('3','Monday', '5:30 PM'),
                            array('4','Tuesday', '4:15 PM'),
                            array('5','Wednesday', '8:30 PM'),
                            array('6','Thursday', '1:45 PM')
      );
      $isTimeExist = array();
      foreach ($appointments as $key => $value) {
          if(in_array($value[2], $isTimeExist)){
              unset($appointments[$key]);
          }
          $isTimeExist[] = $value[2];
      }
      echo "<pre>";
      print_r(array_values($appointments));
      

      【讨论】:

      • 我不喜欢没有任何解释就对任何人投反对票的用户
      猜你喜欢
      • 2010-12-24
      • 1970-01-01
      • 1970-01-01
      • 2014-01-03
      • 1970-01-01
      • 2017-01-01
      • 1970-01-01
      • 2018-01-18
      • 1970-01-01
      相关资源
      最近更新 更多