PHP in_array нысандарын салыстыру?

in_array функциясы объектілерді салыстыру мүмкін бе?

Мысалы, менде көптеген нысандар бар және оларды басқа массивге нақты қосқым келеді. Нысан бұрыннан қосылғанын тексеруге болады ма?

in_array($distinct, $object);

немесе басқа жол бар ма?

11
Мәселен бұл массивтермен жұмыс істейтін болады?
қосылды автор gorgi93, көзі
«Айқын» деген ұғым қандай? Егер «ерекше» сілтеме теңдікке қарама-қарсы болса, онда оны үшінші код ретінде true арқылы өту жеткілікті.
қосылды автор Jon, көзі
«Жұмыстың» кейбір анықтамалары үшін. Сізге қосымша мәлімет беру керек, ой жүгірту қиын.
қосылды автор Jon, көзі
ұқсас сұраққа жауап сізге көмектеседі?
қосылды автор Furgas, көзі
бұл ненің нақты екенін білдіреді, не қажет екенін түсінбейді.
қосылды автор Muhammad, көзі

7 жауаптар

Сіз қатаң салыстыруды пайдалана аласыз:

in_array($object, $array, TRUE);

Пайдалану мысалы:

$a = new stdClass();
$a->x = 42;

$b = new stdClass();
$b->y = 42;

$c = new stdClass();
$c->x = 42;

$array = array($a,$b);

echo in_array($a, $array, true);//1
echo in_array($b, $array, true);//1
echo in_array($c, $array, true); //
16
қосылды

in_array функция объектілерді салыстыра алмайды.

Нысандарыңыздан бірегей кілт-мән жұптарын жасауыңыз керек және соңғы аралыққа жаңа нысан салу кезінде сол кілттерді салыстыру қажет.

Әрбір нысанның бірегей id сипаты бар екенін болжасаңыз, ықтимал шешім:

$unique_objects = array();

// $data represents your object collection
foreach ($data as $item) {
    if (!array_key_exists($item->id, $unique_objects)) {
        $unique_objects[$item->id] = $obj;
    }
}
12
қосылды
Бұл шынында да жұмыс істеді ... XD
қосылды автор gorgi93, көзі
lol, не? $ idem ешбір жерде айнымалы емес, және $ obj де емес пе? Бұл қалай 13 рет дауыс берді?
қосылды автор Kristofer Doman, көзі
Бұл әлі дұрыс емес.
қосылды автор MatTheCat, көзі
Жақсы нәрсе. $ idem typo түзету үшін жауапты жаңарттық. Бұл үлгі кодымен $ obj деген болжам тек $ unique_objects массивіне бірегей қосылуы қажет болатын айнымалы мәнді ұсынады.
қосылды автор ukliviu, көзі

See http://php.net/manual/en/function.spl-object-hash.php

if ( ! array_key_exists( spl_object_hash( $obj ), $objects ) ) {
    $objects[ spl_object_hash( $obj ) ] = $obj;
}

Көңілділер

2
қосылды

Мұны көруге болатын көптеген тәсілдер бар. Мен тағы біреуді қосатынымды ойладым. Мен неге екенін білмеймін, бірақ объектілік массивтермен жұмыс істей отырып, кері байланыс қолданатын жиым функцияларын қолданғым келеді.

Егер сіздің нысандарыңызда қайталану үшін оларды сынағыңыз келсе, қандай да бір идентификатор бар болса, төмендегілер жұмыс істейді:

$found = array_filter($uniqueObjects, function($uniqueObject) use ($object) {
    return $uniqueObject->id == $object->id
});

if (!$found) {
    $uniqueObjects[] = $object;
}

$object is the object you're looking for, and $uniqueObjects is the array of objects you're searching to see if it exists. Just match uniqueObject and object on an identifying property, such as an id.

1
қосылды

PHP-нің нұсқасы жаңа PHP нұсқасының арқасында мүмкін емес екенін білмеймін, бірақ PHP 5.3.16-ні Ubuntu 12.04 нұсқасында қолданды. Ол объектілердің массивіндегі иненің нысанын тапты. Сондай-ақ, мен сол сыныптың басқа нысандарын жүктеу арқылы екі рет тексеріп шығып, сол нысанды қамтымайтын массив мазмұнын тексеріп, шын мәнінде жалған қайтардым.

Иә, in_array нысандарды салыстыра алады.

1
қосылды

«STRICT» «FALSE» болса, салыстыру элементтерді жолға түрлендіру арқылы жасалады. Сондықтан __toString сиқырлы функциясын елемейсеңіз, элементтер элементтерін салыстыруға қол жетімді болуыңыз керек.

0
қосылды

Мен басқаша ойластырғанмын, менің ойымша, әлдеқайда сенімді, опция.

function array_add_unique(&$array, $new, $test, $cb) {
  if(is_array($array) && count($array)>0) {
    for($i = 0; $i < count($array); $i++) {
      if( $array[$i][$test] == $new[$test] ) {
        $do = $cb($array[$i], $new);
        if(is_bool($do) && $do) { $array[$i] = $new; }
        else if(!is_bool($do)) { $array[$i] = $do; }
        return;
      }
    }
  }
  array_push($array, $new);
}

Бұл шешімнің артықшылығы, ол пайдаланушыға соқтығысуды жою үшін анықталған кері қоңырауды қамтиды. Бірегей нысандарды қосқанда, ескі және жаңа нысаннан қасиеттерді сақтау қажет болуы мүмкін.

Жасырын функция болуы мүмкін кері шақыру жаңа нысан мен қолданыстағы нысанды қабылдайды, осылайша пайдаланушыда пайдаланушы есептелуі мүмкін. Бұрыннан бар нысанды жай ғана ауыстыру үшін true оралыңыз немесе оны алмастыру үшін жаңа нысанды қайтарыңыз.

Мен бұл деректерді үлкен деректер жиынтығында білмеймін.

0
қосылды