【问题标题】:Multidimensional array remove duplicates from columns and rows多维数组从列和行中删除重复项
【发布时间】:2015-04-23 21:29:59
【问题描述】:

我必须将一些数据从 excel 文档插入到数据库中。 数据已保存为.csv,然后通过PHP添加到数组中。

数据如下:

Column A  Column B  Column C
100       200       100
50        10        100
200       200       100
30        10        300

然后我用它来分隔每一列(在 foreach 循环中)

list( $columnA, $columnB)   = explode( ',', $values[0] ); 
$columnA= array($columnA);
print_r($columnA);

上面的代码打印了每一列的值。 所以我试图找到一种方法从每一列中删除重复项,然后从每一行中删除(不管列名是什么)。我想从整个文档中删除重复项。例如,对于我发布的数据,我只需要值 100,200,50,10,30,300(仅来自整个文档的唯一值)。

更新: 原始数组(我通过使用 for 循环并从 .CSV 文件传递​​所有数据创建的数组)显示的内容:

Array ( [0] => G2100,100%,,,,,,,,,200,0.24,77,51,2,47, ) 
Array ( [0] => G2101,100%,,,,,,,,,200,0.24,77,42,15,43, ) 
Array ( [0] => G2102,30%,,,,,,,,,200,0.24,77,38,25,37, )

因此,通过使用我之前提到的列表函数,我拆分所有列并获取每列的值。那么如果我打印 $columnB 数组,例如它会显示:

Array ( [0] => 100%) Array ( [0] => 100%) Array ( [0] => 30%) 

等等。当我使用 unique_array 时,它什么也不做。

$columnB = array_unique($columnB, SORT_REGULAR);

我尝试使用 array_map 但它也不起作用。

任何帮助将不胜感激。

【问题讨论】:

    标签: php arrays csv multidimensional-array duplicates


    【解决方案1】:

    我不明白为什么 array_unique 在你的情况下不起作用,因为它实际上解决了问题:

    <?php
    
        $columnA = array(50,50,200,10);
        $columnB = array(100,50,200,100);
        $columnC = array(150,50,250);
    
        $merged = array_merge($columnA, $columnB, $columnC);
    
        $result = array_unique($merged);
    
        var_dump($result);
    
    ?>
    

    输出是:

    array(6) {
      [0]=>
      int(50)
      [2]=>
      int(200)
      [3]=>
      int(10)
      [4]=>
      int(100)
      [8]=>
      int(150)
      [10]=>
      int(250)
    }
    

    这是一个简单的例子,但如果你可以管理你的输入就像上面的数组,那么你可以使用 array_unique 来只有唯一的值......

    编辑 1:

    要从字符串中删除 % 符号,只需在需要的地方使用 rtrim:

     $string = '100%';
     $trimmed = (int)rtrim($string,'%');//make it int(or float if you like)
     var_dump($trimmed);
    

    编辑 2:

    与遍历数组有关:

        //I suppose this
        //Array ( [0] => 100%) Array ( [0] => 100%) Array ( [0] => 30%)
    
        //maps to this
        $columnA = array(
                         0=>array('100%'),
                         1=>array('100%'),
                         2=>array('30%')
                         );
    
        //go through every element
        $temp = array();
        foreach($columnA as $subArray){
            //in this case when we know that there is only one element in the array we can do next:
            $temp[] = $subArray[0];
    
        }
    
        $result = array_unique($temp);
    
        echo "<pre>";
        var_dump($result);
        echo "</pre>";
    

    这将是输出:

     array(2) {
      [0]=>
      string(4) "100%"
      [2]=>
      string(3) "30%"
    }
    

    【讨论】:

    • 感谢您的回答。但是让我告诉你数组返回什么: Array ( [0] => G2100,100%,,,,,,,,,200,0.24,77,51,2,47, ) Array ( [0] => G2101,100%,,,,,,,,,200,0.24,77,42,15,43, ) 数组 ( [0] => G2102,100%,,,,,,,,,200,0.24, 77,38,25,37, ) 因此,通过使用我在帖子中提到的列表函数,我拆分了所有列并获取每列的值。那么如果我打印 columnA 数组,例如它会显示: Array ( [0] => 100%) Array ( [0] => 100%) Array ( [0] => 100%) Array ( [0] => 100 %) 数组 ( [0] => 40%) 数组 ( [0] => 30%) 等等。当我使用 unique_array 时,它什么也不做。
    • 不客气。最好更新这些数据以及您的实际代码(即您提到的 foreach 循环),因为 cmets 不适合这样做。
    • 好的,现在更新它给你一个更好的解释:) 非常感谢
    • 我必须删除 % 符号吗?因为我需要这些值。有什么区别吗?
    • 好吧,您不必这样做,但在您编辑问题之前,您的值没有 % 符号。因此,如果这不是问题,只需尝试用我的示例中的所有值填充一个数组。使用 foreach 遍历 columnX 数组的每个元素并存储其值 ($result[] = $value),然后使用 array_unique。
    猜你喜欢
    • 2018-07-26
    • 2014-05-26
    • 2012-12-14
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    相关资源
    最近更新 更多