Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何检查多维数组中是否存在某些索引的重复值?_Php_Arrays_Multidimensional Array - Fatal编程技术网

Php 如何检查多维数组中是否存在某些索引的重复值?

Php 如何检查多维数组中是否存在某些索引的重复值?,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,我的问题是我有一个从表单到php的多维数组,现在我想检查多维数组中是否存在某些索引的重复值? e、 g: 这里索引1和索引2的名称和类型是相同的,所以我如何检查它 我熟悉 $key = array_search('abc', array_column($data, 'type')); 但是,对于多行中的单列值的重复,在我的情况下,如果同一行的多行与任何其他行的多列相同,则记录将被认为是重复的。 感谢您的帮助。您可以尝试使用array\u reduce使用所需的项目键创建一个键: $result

我的问题是我有一个从表单到php的多维数组,现在我想检查多维数组中是否存在某些索引的重复值? e、 g:

这里索引1和索引2的名称和类型是相同的,所以我如何检查它

我熟悉

$key = array_search('abc', array_column($data, 'type'));

但是,对于多行中的单列值的重复,在我的情况下,如果同一行的多行与任何其他行的多列相同,则记录将被认为是重复的。


感谢您的帮助。

您可以尝试使用
array\u reduce
使用所需的项目键创建一个键:

$result = array_reduce($data, function ($carry, $item) {

    $key = $item['uid'] . $item['type'];

    $item['is_duplicate'] = isset($carry[$key]);

    if ($item['is_duplicate']) {
        $carry[] = $item;
    } else {
        $carry[$key] = $item;
    }

    return $carry;

}, []);

var_dump($result);

您可以尝试使用
array\u reduce
,方法是使用所需的项目键创建一个键:

$result = array_reduce($data, function ($carry, $item) {

    $key = $item['uid'] . $item['type'];

    $item['is_duplicate'] = isset($carry[$key]);

    if ($item['is_duplicate']) {
        $carry[] = $item;
    } else {
        $carry[$key] = $item;
    }

    return $carry;

}, []);

var_dump($result);

最简单的方法,至少我会使用的方法是将数组编码为md5(或任何其他类型)字符串并比较这些值<我认为这对你来说是最有效的 示例:

<?php

function arrayToString($array) {
    $str = ''; 

    if ( !is_array($array) ) 
        return $str; 

    foreach ( $array as $key => $val ) {
        $str .= $key . ':' . $val; 
    }

    return $str; 
}

$data=Array
(
    0 => Array
    (
        'uid' => '100',
        'name' => 'Sandra Shush',
        'type' => 'abc'
    ),
    1 => Array
    (
        'uid'  => '100',
        'name' => 'Sandra Shush',
        'type' => 'xyz'
    ),
    2 => Array
    (
        'uid' => '100',
        'name' => 'Sandra Shush',
        'type' => 'abc'
    )
);

$temp = array(); 
foreach ( $data as $d ) {
    array_push($temp, md5(arrayToString($d))); 
}

$unique = array_unique($temp); 

var_dump($unique); // prints unique array

最简单的方法,至少我会使用的方法是将数组编码为md5(或任何其他类型)字符串并比较这些值<我认为这对你来说是最有效的
示例:

<?php

function arrayToString($array) {
    $str = ''; 

    if ( !is_array($array) ) 
        return $str; 

    foreach ( $array as $key => $val ) {
        $str .= $key . ':' . $val; 
    }

    return $str; 
}

$data=Array
(
    0 => Array
    (
        'uid' => '100',
        'name' => 'Sandra Shush',
        'type' => 'abc'
    ),
    1 => Array
    (
        'uid'  => '100',
        'name' => 'Sandra Shush',
        'type' => 'xyz'
    ),
    2 => Array
    (
        'uid' => '100',
        'name' => 'Sandra Shush',
        'type' => 'abc'
    )
);

$temp = array(); 
foreach ( $data as $d ) {
    array_push($temp, md5(arrayToString($d))); 
}

$unique = array_unique($temp); 

var_dump($unique); // prints unique array

这是一种设计速度非常快的方法,可以找到重复的方法。请注意,重复项是对同一键具有相同值的元素。因此,如果
uid
name
type
中的任何一个匹配,它们将被视为重复项。因此,我调整了第三个数组元素,因为数组中的所有元素都共享相同的值

$data = [
    ....
    2 =>
        [
            'uid'  => '200',
            'name' => 'Mandra Shush',
            'type' => 'abcx'
        ]
];

$duplicates      = [];
$valuesToCompare = ["uid", "name", "type"];

function equals($value, $toCompare, $keysToCompare)
{
    foreach ($keysToCompare as $compareKey) {
        if ($value[$compareKey] === $toCompare[$compareKey]) {
            return true;
        }
    }

    return false;
}

foreach ($data as $index => $element) {
    foreach ($data as $indexInner => $elementToCompare) {
        if ($index !== $indexInner) {
            if (equals($element, $elementToCompare, $valuesToCompare)) {
                $duplicates[] = [$index => $indexInner];
            }
        }
    }
}

var_dump($duplicates);
这将输出以下内容,这表明我们发现了2个重复项。其中,元素0是1的副本,1是0的副本

array (size=2)
  0 => 
    array (size=1)
      0 => int 1
  1 => 
    array (size=1)
      1 => int 0

这是一种非常快速的设计方法,可以找到重复的方法。请注意,重复项是对同一键具有相同值的元素。因此,如果
uid
name
type
中的任何一个匹配,它们将被视为重复项。因此,我调整了第三个数组元素,因为数组中的所有元素都共享相同的值

$data = [
    ....
    2 =>
        [
            'uid'  => '200',
            'name' => 'Mandra Shush',
            'type' => 'abcx'
        ]
];

$duplicates      = [];
$valuesToCompare = ["uid", "name", "type"];

function equals($value, $toCompare, $keysToCompare)
{
    foreach ($keysToCompare as $compareKey) {
        if ($value[$compareKey] === $toCompare[$compareKey]) {
            return true;
        }
    }

    return false;
}

foreach ($data as $index => $element) {
    foreach ($data as $indexInner => $elementToCompare) {
        if ($index !== $indexInner) {
            if (equals($element, $elementToCompare, $valuesToCompare)) {
                $duplicates[] = [$index => $indexInner];
            }
        }
    }
}

var_dump($duplicates);
这将输出以下内容,这表明我们发现了2个重复项。其中,元素0是1的副本,1是0的副本

array (size=2)
  0 => 
    array (size=1)
      0 => int 1
  1 => 
    array (size=1)
      1 => int 0

我实现了上述场景,如下所示:

不知道哪一个是最好的我或其他谁张贴的答案

foreach($data as $key => $row)
{
    $combinedarr[] = array("name"=>$row["name"],"type"=>$row["type"]);
}
//chck if same facilitiy is being visit on same date twice
$countcomb = count($combinedarr);
$uniquearr = array_unique($combinedarr, SORT_REGULAR);
if($countcomb==count($uniquearr)){
}else{
    //yes duplicate exists
};

再次感谢您的回答。

我实现了上述情景,如下所示:

不知道哪一个是最好的我或其他谁张贴的答案

foreach($data as $key => $row)
{
    $combinedarr[] = array("name"=>$row["name"],"type"=>$row["type"]);
}
//chck if same facilitiy is being visit on same date twice
$countcomb = count($combinedarr);
$uniquearr = array_unique($combinedarr, SORT_REGULAR);
if($countcomb==count($uniquearr)){
}else{
    //yes duplicate exists
};
再次感谢那些回答问题的人