Проблема с in_array и многомерным массивом / объектом - PullRequest
0 голосов
/ 10 августа 2011

Вот массив $haystack:

Array
(
    [438] => stdClass Object
        (
            [w] => 438
            [x] => 0
            [y] => 438
            [z] => 23
        )

    [4960] => stdClass Object
        (
            [w] => 4960
            [x] => 0
            [y] => 4960
            [z] => 37
        )

)

Почему это не работает? Как я могу сказать, $needle в $haystack. Я получаю эту ошибку stdClass could not be converted to int.

$needle = 438;
if(in_array($needle,$haystack)){
  echo "yes";
}else{
  echo "no";
}

Ответы [ 4 ]

1 голос
/ 10 августа 2011

Ключ массива существует

Похоже, правильный путь для этого - использовать функцию array_key_exists.

Как указали Джон и Андреас, вы ищете ключ, а недля значения.in_array ищет значения массива.

<?php 
if(array_key_exists(438, $array)) { //found
  echo "yes";
}else{
  echo "no";
}

Документация здесь: http://php.net/manual/en/function.array-key-exists.php

1 голос
/ 10 августа 2011

Функция in_array проверяет, что указанная игла равна одному из значений в массиве, а не одному из ключей в массиве.

Вы по сути дела:

if (438 == stdClass Object(
            [w] => 438
            [x] => 0
            [y] => 438
            [z] => 23
        )
    ||
    438 ==  stdClass Object(
            [w] => 4960
            [x] => 0
            [y] => 4960
            [z] => 37
        )
   ) {
  echo "yes";
}
else {
  echo "no";
}

Что вы должны использовать:

$needle = 438;
if (array_key_exists($needle, $haystack)) {
  echo 'yes';
}
else {
  echo 'no';
}
1 голос
/ 10 августа 2011

Вы ищете значения, а не ключи.Это работает так:

if ($haystack[$needle]){
   ...
}
0 голосов
/ 10 августа 2011

сначала вам нужно преобразовать ваш стог сена в многомерный массив

Функция для преобразования объектов stdClass в многомерные массивы

<?php

    function objectToArray($d) {
        if (is_object($d)) {
            // Gets the properties of the given object
            // with get_object_vars function
            $d = get_object_vars($d);
        }

        if (is_array($d)) {
            /*
            * Return array converted to object
            * Using __FUNCTION__ (Magic constant)
            * for recursive call
            */
            return array_map(__FUNCTION__, $d);
        }
        else {
            // Return array
            return $d;
        }
    }

?>

http://www.if -not-true-then-false.com / 2009 / PHP-зонд-новообращенный-StdClass-объект к многомерному массиву-и-новообращенной-многомерный массив к stdclass- объект /

Вы можете получить возвращенный массив, который будет идеальным массивом, готовым для поиска

function in_multiarray($elem, $array)
{
    $top = sizeof($array) - 1;
    $bottom = 0;
    while($bottom <= $top)
    {
        if($array[$bottom] == $elem)
            return true;
        else 
            if(is_array($array[$bottom]))
                if(in_multiarray($elem, ($array[$bottom])))
                    return true;

        $bottom++;
    }        
    return false;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...