in_array函数无法检查具有多个属性的对象

时间:2017-02-27 05:56:07

标签: php arrays

如果$gymnast对象不在$gymnasts数组中,我将其添加到我的表中。但是,当我向数组添加相同的对象时,in_array()失败(返回1)并且重复的对象被添加到数组中。使用print_r,我看到$gymnast对象显然与$gymnasts数组中的第一个元素相同,为什么会发生这种情况?我该如何解决这个问题?

$ gymnasts array

Array ( [0] => Gymnast Object ( [name] => Nastia Liukin [age] => 27 [height] => 5' 3" [olympicYear] => 2008 [medalCount] => 5 [image] => nastia.jpg ) [1] => Gymnast Object ( [name] => Shawn Johnson [age] => 25 [height] => 4' 11" [olympicYear] => 2008 [medalCount] => 4 [image] => shawn.jpg ))

$ gymnast object

Gymnast Object ( [name] => Nastia Liukin [age] => 27 [height] => 5' 3" [olympicYear] => 2008 [medalCount] => 5 [image] => nastia.jpg )

的index.php

<?php
function isDuplicateEntry($gymnast, $gymnasts) {
    foreach ($gymnasts as $gym) {
        $gymArr = get_object_vars($gym);
        $gymnastArr = get_object_vars($gymnast);
    if (count(array_diff($gymnastArr, $gymArr)) == 0) { //gymnast object already exists in array
        return true;
    }
    else {
        return false;
    }
    }
}

 //Add gymnast when press add submit button
        if(isset($_POST['add'])){
            //Set gymnast array to all gymnasts in data.txt
            $gymnasts = read_file($filename);

            //If form has valid elements & no duplicats, add to data.txt file
            if($valid_name && $valid_age && $valid_feet && $valid_inches && $valid_olympicYear && $valid_medalCount && $valid_image){
                $gymnast = get_gymnast_from_form();

                //Make sure gymnast is not null
                if(!is_null($gymnast)){
                    //Prevent from adding duplicates
                    if(!isDuplicateEntry($gymnast, $gymnasts)){
                        //Write task to file
                        write_file($filename, $gymnast);
                        //Add gymnast to global var gymnasts array
                        $gymnasts[] = $gymnast;
                        echo'<div class ="title">Gymnast Added!</div>';
                    }
                }
            }
?>

2 个答案:

答案 0 :(得分:0)

您无法立即将in_array用于多维对象。你必须循环它们以找出匹配。 使用array_intersect检查阵列是否存在于另一个阵列中。

$flag = 0;
foreach ($gymnasts as $gym {
    if (count(array_intersect($gymnast, $gym)) == count($gym)) {
        echo 'It is present.';
        $flag = 1;
        break;
    }
}

if ($flag == 0) {
    echo 'Not present in array';
}

您还可以使用array_diff来匹配数组。

$flag = 0;
foreach ($gymnasts as $gym) {
    if (count(array_diff($gymnast, $gym)) == 0) {
        echo 'It is present.';
        $flag = 1;
        break;
    }
}

if ($flag == 0) {

    echo 'Not present';
}

array_intersect

array_diff

ideone link array_intersect

ideone link array_diff

答案 1 :(得分:0)

您可以array_filter使用count

$is_in_array = count(array_filter($gymnasts, function($member) use ($gymnast) {
    return $member == $gymnast;
})) > 0;