Php 从数组中删除重复项,但忽略一个参数

Php 从数组中删除重复项,但忽略一个参数,php,arrays,object,multidimensional-array,Php,Arrays,Object,Multidimensional Array,我有一个由PHP对象组成的数组,如下所示: $objects[0] => $object->type => 'President' $object->name => 'Joe Blogs' $object->address => '123 Harry Street' $objects[1] => $object->type => 'Secretary'

我有一个由PHP对象组成的数组,如下所示:

$objects[0] => $object->type => 'President'
               $object->name => 'Joe Blogs'
               $object->address => '123 Harry Street'

$objects[1] => $object->type => 'Secretary'
               $object->name => 'Joe Blogs'
               $object->address => '123 Harry Street'

$objects[2] => $object->type => 'Treasurer'
               $object->name => 'Jane Doe'
               $object->address => '456 Upton Street'
我想忽略
类型
参数,并以以下结果结束:

$objects[0] => $object->type => 'President'
               $object->name => 'Joe Blogs'
               $object->address => '123 Harry Street'

$objects[2] => $object->type => 'Treasurer'
               $object->name => 'Jane Doe'
               $object->address => '456 Upton Street'
我尝试了几种不同的方法,其中之一是使用
foreach
循环取消参数
type
,然后尝试重置它,但我不确定如何将两个索引绑定在一起以重置它们。另一个尝试在select命令中使用union,但也没有100%正确地工作

我只是不知道如何最好地管理
类型
参数

编辑:

我已经试着让查询变得简单一点,它现在返回一个ID列表,稍后我将获得地址信息。这是我想过滤掉任何重复的新数组

    $items['president'][0] = '1'
                       [1] = '2'
                       [2] = '3'

    $items['secretary'][0] = '1'
                       [1] = '4'
                       [2] = '5'
我想要的是

$items['president'][0] = '1'
                   [1] = '2'
                   [2] = '3'

$items['secretary'][1] = '4'
                   [2] = '5'

这样更好吗?(注意:我可以使用两种数组结构,但第二种更好)

这应该适合您:

在这里,我只是浏览了
$objects
中的每个对象。然后,我使用检查了
$unique
中的所有唯一对象,并检查是否有一个对象,它在
name
address
中的值与迭代的当前值相同

如果
$unique
中没有具有相同值的对象
name
address
,我将其添加到该对象中

<?php

    $unique = [];

    foreach($objects as $o) {

        $duplicate = array_reduce($unique, function($keep, $v)use($o){
            if($v->name == $o->name && $v->address == $o->address)
                return $keep = TRUE;
        }, FALSE);

        if(!$duplicate)
            $unique[] = $o;

    }

    print_r($unique);

?>
编辑:

根据您关于新数组结构的更新问题,类似这样的内容应该会起作用:

就像之前一样,您有一个具有唯一值的数组,还有一个数组来跟踪
$unique
数组中已经存在的值。然后,只要在数组中循环检查值是否不在值数组中即可

<?php

    $unique = [];
    $values = [];

    foreach($items as $keyOne => $arr) {

        foreach($arr as $keyTwo =>$v) {
            if(!in_array($v, $values)) {
                $unique[$keyOne][$keyTwo] = $v;
                $values[] = $v;
            }
        }
    }   

    print_r($unique);


?>

您可以将
类型
作为键,这样它就不会被复制,如果您不想重写,您可以使用验证它的存在,然后您可以根据需要获取订单,请参见下面的示例:

$newArray = array();
foreach($objects as $object){
    if(!array_key_exists($object->name, $newArray)){
        $newArray[$object->name] = $object;
    }
}
$newArray = array_values($newArray);
echo '<pre>';
print_r($newArray);
$newArray=array();
foreach($objects作为$object){
如果(!array\u key\u存在($object->name,$newArray)){
$newArray[$object->name]=$object;
}
}
$newArray=array\u值($newArray);
回声';
打印(新数组);

您可以使用array\u unique,此函数使用toString方法比较对象:

function custom_array_unique($array, $function){
    $res = array();
    foreach($array as $o){
        if(!isset($res[$function($o)])) {
            $res[$function($o)] = $o;
        }
    }
    return array_values($res);
}

$unique2 = custom_array_unique($objects, function($obj){
    return $obj->name . $obj->address;
});

var_dump($unique2);
或者,如果出于某种原因,您无法在对象中使用_toString,请编写您自己的唯一函数,该函数可以使用自定义函数进行比较,该自定义函数可根据需要返回唯一的_id:


我尝试了一些不同的东西来显示您的尝试。我尝试过解释我的尝试,但没有任何效果,因此我不会显示我的尝试代码。那么这个问题我们在哪里?我们进展顺利,我编辑了选择函数以使阵列更好一些。那容易吗?是的,谢谢。在处理你的答案时,我意识到第二个数组可能会让我做得更好一些。我很抱歉把你塞在这里。你知道第二种结构的方法吗?确保留下否决票的理由,这样如果有任何错误,就可以纠正!除了代码中的语法错误外,它也不会输出OP的预期输出。我想你错过了这一部分:我想忽略“type”我想你也错过了我评论中的这一部分:除了语法错误,请告诉我:
$newArray()应该怎么做?而且代码的输出仍然与OP的预期输出不匹配(顺便说一句:
array\u values($newArray);
不符合您的想法),但是不会因为$type不同而认为所有三个对象都是唯一的吗?不,我试过了,想法是array\u unique将每个对象与数组中的每个其他对象进行比较,如果它已经存在,它将不会在结果中再次生成它,但是,由于array_unique使用对象的_toString()函数(如果可用)来获得对象的更简单的字符串表示形式,然后比较字符串表示形式而不是对象本身,以符合您想法的方式实现该方法,忽略类型将产生预期的结果尽管这可能不是最优雅的解决方案,因为您可能希望将toString用于其他用途,这就是为什么我包含了第二个示例,其中您可以在类之外定义一个函数,该函数返回一个特殊字符串,然后可以进行比较。是的,这现在是有意义的,很遗憾,我没有访问_toString()函数的权限。@joschua011我喜欢你的第一个代码。但是我认为将所有内容转换为
obj
类,然后获取唯一值,然后将它们转换回来有点过分了。非常感谢!一个伟大的方式做它!
$newArray = array();
foreach($objects as $object){
    if(!array_key_exists($object->name, $newArray)){
        $newArray[$object->name] = $object;
    }
}
$newArray = array_values($newArray);
echo '<pre>';
print_r($newArray);
class obj{
    public $type;
    public $name;
    public $address;

    public function __construct($type, $name, $address){
        $this->type = $type;
        $this->name = $name;
        $this->$address = $address;
    }

    public function __toString(){
        return $this->name . $this->address;
    }
}


$objects = array(
    new obj('President','Joe Bogs','123 Harry Street'),
    new obj('Treasurer','Joe Bogs','123 Harry Street'),
    new obj('Secretary','Jane Doh','456 Harry Street'),
);

// array_unique compares the toString value if given objects
$unique = array_unique($objects);
function custom_array_unique($array, $function){
    $res = array();
    foreach($array as $o){
        if(!isset($res[$function($o)])) {
            $res[$function($o)] = $o;
        }
    }
    return array_values($res);
}

$unique2 = custom_array_unique($objects, function($obj){
    return $obj->name . $obj->address;
});

var_dump($unique2);