Hướng dẫn how do you make an array of objects unique in php? - làm thế nào để bạn tạo một mảng đối tượng duy nhất trong php?

99

Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.

Có phương pháp nào như Array_unique cho các đối tượng không? Tôi có một loạt các mảng với các đối tượng 'vai trò' mà tôi hợp nhất, và sau đó tôi muốn lấy ra các bản sao :)

Hướng dẫn how do you make an array of objects unique in php? - làm thế nào để bạn tạo một mảng đối tượng duy nhất trong php?

Benmorel

32,8K48 Huy hiệu vàng173 Huy hiệu bạc305 Huy hiệu đồng48 gold badges173 silver badges305 bronze badges

hỏi ngày 11 tháng 3 năm 2010 lúc 16:06Mar 11, 2010 at 16:06

Hướng dẫn how do you make an array of objects unique in php? - làm thế nào để bạn tạo một mảng đối tượng duy nhất trong php?

2

class Role {
    private $name;

    //.....

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

}
0 hoạt động với một loạt các đối tượng bằng cách sử dụng
class Role {
    private $name;

    //.....

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

}
1:
works with an array of objects using
class Role {
    private $name;

    //.....

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

}
1
:

class MyClass {
    public $prop;
}

$foo = new MyClass();
$foo->prop = 'test1';

$bar = $foo;

$bam = new MyClass();
$bam->prop = 'test2';

$test = array($foo, $bar, $bam);

print_r(array_unique($test, SORT_REGULAR));

Sẽ in:

Array (
    [0] => MyClass Object
        (
            [prop] => test1
        )

    [2] => MyClass Object
        (
            [prop] => test2
        )
)

Xem nó trong hành động tại đây: http://3v4l.org/vonh#v529

Cảnh báo: Nó sẽ sử dụng so sánh "==", không so sánh nghiêm ngặt ("===").: it will use the "==" comparison, not the strict comparison ("===").

Vì vậy, nếu bạn muốn xóa các bản sao bên trong một mảng các đối tượng, hãy cẩn thận rằng nó sẽ so sánh từng thuộc tính đối tượng, không so sánh nhận dạng đối tượng (ví dụ).

Đã trả lời ngày 13 tháng 8 năm 2013 lúc 7:54Aug 13, 2013 at 7:54

Matthieu Napolimatthieu NapoliMatthieu Napoli

46.6K44 Huy hiệu vàng164 Huy hiệu bạc256 Huy hiệu Đồng44 gold badges164 silver badges256 bronze badges

5

Vâng,

class Role {
    private $name;

    //.....

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

}
2 so sánh giá trị chuỗi của các phần tử:

Lưu ý: Hai phần tử được coi là bằng nhau khi và chỉ khi

class Role {
    private $name;

    //.....

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

}
3 tức là khi biểu diễn chuỗi giống nhau, phần tử đầu tiên sẽ được sử dụng.: Two elements are considered equal if and only if
class Role {
    private $name;

    //.....

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

}
3 i.e. when the string representation is the same, the first element will be used.

Vì vậy, hãy đảm bảo thực hiện phương thức

class Role {
    private $name;

    //.....

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

}
4 trong lớp của bạn và nó xuất ra cùng một giá trị cho các vai trò bằng nhau, ví dụ:

class Role {
    private $name;

    //.....

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

}

Điều này sẽ coi hai vai trò là bình đẳng nếu chúng có cùng tên.

Shakaran

10.3k2 Huy hiệu vàng28 Huy hiệu bạc46 Huy hiệu đồng2 gold badges28 silver badges46 bronze badges

Đã trả lời ngày 11 tháng 3 năm 2010 lúc 16:09Mar 11, 2010 at 16:09

Hướng dẫn how do you make an array of objects unique in php? - làm thế nào để bạn tạo một mảng đối tượng duy nhất trong php?

Felix Klingfelix KlingFelix Kling

772K172 Huy hiệu vàng1069 Huy hiệu bạc1116 Huy hiệu đồng172 gold badges1069 silver badges1116 bronze badges

3

Câu trả lời này sử dụng

class Role {
    private $name;

    //.....

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

}
5 vì bản chất của việc so sánh các đối tượng trong Php 5 cho phép chúng ta làm như vậy. Việc sử dụng hành vi so sánh đối tượng này yêu cầu mảng chỉ chứa các đối tượng, nhưng điều đó dường như là trường hợp ở đây.

$merged = array_merge($arr, $arr2);
$final  = array();

foreach ($merged as $current) {
    if ( ! in_array($current, $final)) {
        $final[] = $current;
    }
}

var_dump($final);

Đã trả lời ngày 22 tháng 12 năm 2010 lúc 9:57Dec 22, 2010 at 9:57

Salathesaleditsalathe

50.5k11 Huy hiệu vàng103 Huy hiệu bạc130 Huy hiệu đồng11 gold badges103 silver badges130 bronze badges

4

Đây là một cách để loại bỏ các đối tượng trùng lặp trong một mảng:

Hố đen

19.7K7 Huy hiệu vàng67 Huy hiệu bạc67 Huy hiệu Đồng7 gold badges67 silver badges67 bronze badges

Đã trả lời ngày 21 tháng 2 năm 2011 lúc 14:47Feb 21, 2011 at 14:47

Hướng dẫn how do you make an array of objects unique in php? - làm thế nào để bạn tạo một mảng đối tượng duy nhất trong php?

Yankeyankeeyankee

37K14 Huy hiệu vàng98 Huy hiệu bạc158 Huy hiệu đồng14 gold badges98 silver badges158 bronze badges

1

Bạn cũng có thể tuần tự hóa trước:

$unique = array_map( 'unserialize', array_unique( array_map( 'serialize', $array ) ) );

Kể từ Php 5.2.9, bạn chỉ có thể sử dụng tùy chọn

class Role {
    private $name;

    //.....

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

}
6:

$unique = array_unique( $array, SORT_REGULAR );

Littm

4.9134 Huy hiệu vàng29 Huy hiệu bạc37 Huy hiệu đồng4 gold badges29 silver badges37 bronze badges

Đã trả lời ngày 31 tháng 7 năm 2012 lúc 8:21Jul 31, 2012 at 8:21

RemonremonRemon

1591 Huy hiệu bạc4 Huy hiệu đồng1 silver badge4 bronze badges

0

Bạn cũng có thể sử dụng chức năng Array_filter của họ, nếu bạn muốn lọc các đối tượng dựa trên một thuộc tính cụ thể:

//filter duplicate objects
$collection = array_filter($collection, function($obj)
{
    static $idList = array();
    if(in_array($obj->getId(),$idList)) {
        return false;
    }
    $idList []= $obj->getId();
    return true;
});

Đã trả lời ngày 9 tháng 8 năm 2014 lúc 10:33Aug 9, 2014 at 10:33

Từ đây: http://php.net/manual/en/function.array-unique.php#75307

Điều này cũng sẽ làm việc với các đối tượng và mảng.

$val)
    {
        // convert objects to arrays, in_array() does not support objects
        if (is_object($val))
            $val = (array)$val;

        if (!in_array($val, $tmp))
            $tmp[] = $val;
        else
            $duplicate_keys[] = $key;
    }

    foreach ($duplicate_keys as $key)
        unset($array[$key]);

    return $keep_key_assoc ? $array : array_values($array);
}
?>

Đã trả lời ngày 22 tháng 12 năm 2010 lúc 8:55Dec 22, 2010 at 8:55

Ánh sáng bạc ánh sángSilver Light

42.6K35 Huy hiệu vàng119 Huy hiệu bạc163 Huy hiệu Đồng35 gold badges119 silver badges163 bronze badges

0

Nếu bạn có một mảng đối tượng được lập chỉ mục và bạn muốn xóa các bản sao bằng cách so sánh một thuộc tính cụ thể trong mỗi đối tượng, có thể sử dụng một hàm như

class Role {
    private $name;

    //.....

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

}
7 bên dưới.

class Car {
    private $model;

    public function __construct( $model ) {
        $this->model = $model;
    }

    public function get_model() {
        return $this->model;
    }
}

$cars = [
    new Car('Mustang'),
    new Car('F-150'),
    new Car('Mustang'),
    new Car('Taurus'),
];

function remove_duplicate_models( $cars ) {
    $models = array_map( function( $car ) {
        return $car->get_model();
    }, $cars );

    $unique_models = array_unique( $models );

    return array_values( array_intersect_key( $cars, $unique_models ) );
}

print_r( remove_duplicate_models( $cars ) );

Kết quả là:

Array (
    [0] => MyClass Object
        (
            [prop] => test1
        )

    [2] => MyClass Object
        (
            [prop] => test2
        )
)
0

Đã trả lời ngày 1 tháng 2 năm 2019 lúc 20:25Feb 1, 2019 at 20:25

Sane và nhanh chóng nếu bạn cần lọc các trường hợp trùng lặp (tức là "===" So sánh) ra khỏi mảng và:

  • Bạn chắc chắn những gì mảng chỉ giữ các đối tượng
  • Bạn không cần chìa khóa được bảo tồn

is:

Array (
    [0] => MyClass Object
        (
            [prop] => test1
        )

    [2] => MyClass Object
        (
            [prop] => test2
        )
)
1

Đã trả lời ngày 20 tháng 4 năm 2016 lúc 15:17Apr 20, 2016 at 15:17

Đây là giải pháp rất đơn giản:

Array (
    [0] => MyClass Object
        (
            [prop] => test1
        )

    [2] => MyClass Object
        (
            [prop] => test2
        )
)
2

Đã trả lời ngày 20 tháng 12 năm 2019 lúc 21:05Dec 20, 2019 at 21:05

Hướng dẫn how do you make an array of objects unique in php? - làm thế nào để bạn tạo một mảng đối tượng duy nhất trong php?

Bạn cũng có thể làm cho mảng độc đáo bằng cách sử dụng hàm gọi lại (ví dụ: nếu bạn muốn so sánh thuộc tính của đối tượng hoặc bất kỳ phương thức nào).

Đây là chức năng chung mà tôi sử dụng cho mục đích này:

Array (
    [0] => MyClass Object
        (
            [prop] => test1
        )

    [2] => MyClass Object
        (
            [prop] => test2
        )
)
3

Sử dụng mẫu:

Array (
    [0] => MyClass Object
        (
            [prop] => test1
        )

    [2] => MyClass Object
        (
            [prop] => test2
        )
)
4

Đã trả lời ngày 13 tháng 10 năm 2021 lúc 14:51Oct 13, 2021 at 14:51

BlackbamblackbamBlackbam

15.9K23 Huy hiệu vàng87 Huy hiệu bạc142 Huy hiệu đồng23 gold badges87 silver badges142 bronze badges

Phiên bản

class Role {
    private $name;

    //.....

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

}
0 để so sánh nghiêm ngặt (
class Role {
    private $name;

    //.....

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

}
9), bảo quản khóa:strict (
class Role {
    private $name;

    //.....

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

}
9) comparison, preserving keys:

Array (
    [0] => MyClass Object
        (
            [prop] => test1
        )

    [2] => MyClass Object
        (
            [prop] => test2
        )
)
5

Usage:

Array (
    [0] => MyClass Object
        (
            [prop] => test1
        )

    [2] => MyClass Object
        (
            [prop] => test2
        )
)
6

Đã trả lời ngày 8 tháng 7 lúc 14:14Jul 8 at 14:14

Hejdavhejdavhejdav

1.12713 Huy hiệu bạc19 Huy hiệu đồng13 silver badges19 bronze badges

Array_unique hoạt động bằng cách đúc các yếu tố vào một chuỗi và thực hiện một so sánh. Trừ khi các đối tượng của bạn được đúc duy nhất vào chuỗi, thì chúng sẽ không hoạt động với Array_unique.

Thay vào đó, hãy thực hiện một chức năng so sánh trạng thái cho các đối tượng của bạn và sử dụng Array_Filter để loại bỏ những thứ mà chức năng đã thấy.

Đã trả lời ngày 21 tháng 2 năm 2011 lúc 14:46Feb 21, 2011 at 14:46

Hướng dẫn how do you make an array of objects unique in php? - làm thế nào để bạn tạo một mảng đối tượng duy nhất trong php?

JRICHERJRICHERjricher

2.6371 Huy hiệu vàng17 Huy hiệu bạc17 Huy hiệu đồng1 gold badge17 silver badges17 bronze badges

2

Đây là cách tôi so sánh các đối tượng với các thuộc tính đơn giản, đồng thời nhận được một bộ sưu tập duy nhất:

Array (
    [0] => MyClass Object
        (
            [prop] => test1
        )

    [2] => MyClass Object
        (
            [prop] => test2
        )
)
7

Sẽ đầu ra:

Array (
    [0] => MyClass Object
        (
            [prop] => test1
        )

    [2] => MyClass Object
        (
            [prop] => test2
        )
)
8

Đã trả lời ngày 9 tháng 5 năm 2018 lúc 10:39May 9, 2018 at 10:39

GanderganderGander

1.7241 Huy hiệu vàng23 Huy hiệu bạc27 Huy hiệu đồng1 gold badge23 silver badges27 bronze badges

Nếu bạn có mảng các đối tượng và bạn muốn lọc bộ sưu tập này để xóa tất cả các bản sao, bạn có thể sử dụng Array_Filter với chức năng ẩn danh:

Array (
    [0] => MyClass Object
        (
            [prop] => test1
        )

    [2] => MyClass Object
        (
            [prop] => test2
        )
)
9

Quan trọng: Hãy nhớ rằng bạn phải vượt qua mảng

$merged = array_merge($arr, $arr2);
$final  = array();

foreach ($merged as $current) {
    if ( ! in_array($current, $final)) {
        $final[] = $current;
    }
}

var_dump($final);
0 làm tham chiếu đến chức năng gọi lại của bạn nếu không nó sẽ không hoạt động Remember that you must pass
$merged = array_merge($arr, $arr2);
$final  = array();

foreach ($merged as $current) {
    if ( ! in_array($current, $final)) {
        $final[] = $current;
    }
}

var_dump($final);
0 array as reference to you filter callback function otherwise it will not work

Đã trả lời ngày 25 tháng 1 năm 2019 lúc 10:54Jan 25, 2019 at 10:54

Hướng dẫn how do you make an array of objects unique in php? - làm thế nào để bạn tạo một mảng đối tượng duy nhất trong php?

Làm thế nào để bạn làm cho một mảng đối tượng trở nên độc đáo?

Sử dụng bản đồ để lưu trữ các đối tượng và kiểm tra xem đối tượng tương tự có nhìn thấy hay không ...
Khởi tạo một bản đồ trống ..
Lặp qua mảng bằng phương pháp bộ lọc ..
Kiểm tra xem có bất kỳ mục nhập nào trong bản đồ có cùng tên với đối tượng hiện tại. ....
In các đối tượng độc đáo ..

Mảng duy nhất trong PHP là gì?

Array_unique () là một hàm tích hợp trong PHP và hàm này loại bỏ các giá trị trùng lặp khỏi một mảng.Nếu có nhiều phần tử trong mảng có cùng giá trị thì phần tử xuất hiện đầu tiên sẽ được giữ và tất cả các lần xuất hiện khác của phần tử này sẽ bị xóa khỏi mảng.removes duplicate values from an array. If there are multiple elements in the array with same values then the first appearing element will be kept and all other occurrences of this element will be removed from the array.

Làm thế nào để bạn khai báo một mảng các đối tượng trong PHP?

Chúng ta có thể sử dụng hàm mảng () để tạo một mảng các đối tượng trong PHP.Hàm sẽ lấy đối tượng làm đối số và sẽ tạo ra một mảng các đối tượng đó.Chúng ta có thể tạo các đối tượng bằng cách tạo một lớp và xác định một số thuộc tính của lớp.Các thuộc tính của lớp sẽ có một số giá trị.use the array() function to create an array of objects in PHP. The function will take the object as the arguments and will create an array of those objects. We can create objects by creating a class and defining some properties of the class. The properties of the class will have some values.

Bạn có thể có một mảng các đối tượng trong PHP không?

Có, có thể có mảng các đối tượng trong PHP.Chúng ta có phải tiếp tục tăng chỉ số hàm tạo trong myObject () mỗi khi chúng ta muốn thêm một đối tượng mới vào mảng hoặc nó là tùy chọn?Tất cả những thứ OOP này trong ngôn ngữ web chỉ đơn giản là rất tiếc!. Do we have to go on incrementing the constructor index in myObject() each time we want to add a new object in the array or is it optional? All this OOP stuff in web languages is simply OOPS!