2017-02-27 140 views
0

如果$gymnast对象不在$gymnasts数组中,我将它添加到我的表中。但是,当我将相同的对象添加到数组时,in_array()失败(返回1),并将重复的对象添加到数组中。使用print_r,我看到$gymnast对象显然与$gymnasts数组中的第一个元素相同,那么为什么会发生这种情况?我该如何解决?in_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 ([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>'; 
        } 
       } 
      } 
?> 
+0

嗨。 in_array函数可能会比较使用那些引用而不是它的键和值的对象。尝试实现一个函数来替换in_array。 –

+0

看到这篇文章:http://stackoverflow.com/questions/17231925/php-in-array-object-comparing –

回答

0

不能使用in_array立即为多维对象。你将不得不循环他们找出匹配。 使用array_intersect来检查数组是否存在于另一个数组中。可以使用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

+0

我试过(见上面更新的代码),但它没有工作,即使'$ gymArr $'和'$ gymnastArr $'都是'Array([name] => Nastia Liukin [age] => 27 [height] => 5'3“[olympicYear] => 2008 [medalCount] => 5 [image] => nastia.jpg)Array([name] => Nastia Liukin [age] => 27 [height] => 5'3“[olympicYear] => 2008 [medalCount] => 5 [image] => 。我是否有错误? – 14wml

+0

@ 15ongm你可以给你的代码片段的链接。尝试在我提供的ideone链接中输入数据。 – Ayush

0

您可以使用array_filtercount

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