Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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_Array Unique - Fatal编程技术网

Php 对象数组的唯一数组,对象中的某些键具有排除选项

Php 对象数组的唯一数组,对象中的某些键具有排除选项,php,arrays,array-unique,Php,Arrays,Array Unique,我有一个几乎没有字段的对象数组 我能够使用以下代码获得此对象数组的唯一数组: $aa = array_unique($dd,SORT_REGULAR); 但我试图实现的是,我想从“唯一检查”中排除对象中的某些键。假设所有对象值都是匹配的,除了“valid_from”和“valid_to”日期字段 以下是阵列结构: Array ( [9948] => stdClass Object ( [payrate] => 78.00000

我有一个几乎没有字段的对象数组

我能够使用以下代码获得此对象数组的唯一数组:

$aa = array_unique($dd,SORT_REGULAR);
但我试图实现的是,我想从“唯一检查”中排除对象中的某些键。假设所有对象值都是匹配的,除了“valid_from”和“valid_to”日期字段

以下是阵列结构:

Array
(
    [9948] => stdClass Object
        (
            [payrate] => 78.00000
            [valid_from] => 03/01/2017
            [valid_to] => 03/31/2017
        )

    [15133] => stdClass Object
        (
            [payrate] => 78.00000
            [valid_from] => 04/01/2017
            [valid_to] => 04/31/2017
        )

)
因此,根据上述情况,由于我的工资率在两个对象中相同,但由于有效起始日期和有效终止日期不同,因此仍将被视为不同的条目

我们是否可以为对象数组的数组唯一性指定排除某些字段

您可以使用自定义回调从数组中筛选出一些元素

你所要做的就是实现你的过滤逻辑。这里有一个简单的例子:

<?php
$array = json_decode(
    '[{"name":"foo","count":2},{"name":"foo","count":10},{"name":"baz","count":5},{"name":"foobar","count":10}]'
);

$uniqueCheck = [];

$filtered = array_filter(
    $array,
    function ($element) use (&$uniqueCheck) {
        if (isset($uniqueCheck[$element->name])) {
            return false;
        }

        $uniqueCheck[$element->name] = true;

        return true;
    }
);

print_r($array);
print_r($filtered);
编辑:将基于
$element->count
的检查更改为“唯一
$element->name
检查”。

另请参见

在使用非stdClass对象的情况下,您可以实现uu toString,以使用过滤器的唯一数组

要在唯一的stdClass上进行筛选,只需使用几个属性,您可以尝试以下操作:

从PHP7开始,您可以使用array_列从stdClass获取值,因此如果您使用PHP7:

array_unique(array_column($array,'payrate'));
在PHP 7之前,您可以尝试:

array_unique(array_map(function($item) {return $item->payrate;},$array);
如果有更多属性需要比较,则有不同的方法
array\u reduce
只是其中之一

这一次的结果不会有任何重复。因此,如果所有属性都匹配,则该项将被过滤

$attributes = ['payrate','date']
$filtered = array_reduce($array,function($carry,$item) use ($attributes) {
    if(count(array_filter($attributes,function ($attribute) use ($carry, $item) {
            return !in_array($item->$attribute,array_map(function($carriedItem) use ($attribute) {
                return $carriedItem->$attribute;
            },$carry));
        }))) {
        $carry[] = $item;
    }
    return $carry;
},[]);

请看

太棒了,让我试试,我会让你知道的!非常感谢。如果您需要有关
array\u filter
的帮助,在我的回答中,它链接到PHP手册。这将在count中检查该值,对吗?但是如何从这个回调函数中排除count呢?如果有多个字段,比如payrate、hours、date等呢?是的,我没有测试最后一点。真棒的人,你是天才,根据我的要求调整了它,它成功了!我很乐意帮忙。我不会经常在一个函数中使用array\u reduce、array\u filter和array\u map;-)否则,请检查此场景:它看起来像三个不同的值,但由于这两个值都存在于前一个值中,因此结果中不包括第三个类。我认为这是不受欢迎的行为
$attributes = ['payrate','date']
$filtered = array_reduce($array,function($carry,$item) use ($attributes) {
    if(count(array_filter($attributes,function ($attribute) use ($carry, $item) {
            return !in_array($item->$attribute,array_map(function($carriedItem) use ($attribute) {
                return $carriedItem->$attribute;
            },$carry));
        }))) {
        $carry[] = $item;
    }
    return $carry;
},[]);