我有一个由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'
我想忽略type
参数,最后得到:
$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命令中使用并集,但也不能100%正确工作。
我只是不确定如何最好地管理type
参数。
编辑:
我试着让查询变得简单一点,现在它会返回一个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
中的每个对象。然后,我用array_reduce()
遍历$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);
?>
输出:
Array
(
[0] => stdClass Object
(
[type] => President
[name] => Joe Blogs
[address] => 123 Harry Street
)
[1] => stdClass Object
(
[type] => Treasurer
[name] => Jane Doe
[address] => 456 Upton Street
)
)
编辑:
根据您关于新数组结构的最新问题,应该可以使用以下方法:
就像之前有一个具有唯一值的数组,还有一个跟踪$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);
?>
输出:
Array
(
[president] => Array
(
[0] => 1
[1] => 2
[2] => 3
)
[secretary] => Array
(
[1] => 4
[2] => 5
)
)
您只需使用array_unique,此函数使用toString方法比较对象:
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);
或者,如果由于某种原因,您不能在对象中使用__toString,那么编写您自己的唯一函数,该函数可以使用自定义函数进行比较,该函数根据您的需要返回unique_id:
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);
您可以将type
作为密钥,这样它就不会重复,如果您不想覆盖,您可以使用array_key_exists
来验证它的存在,然后您可以根据需要使用array_values
来获取订单,请参见下面的示例:
$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);