Сравнение двух массивов

 
0
 
PHP
ava
Zorak | 19.03.2013, 14:42
Всем здраствуйте.
В результате выполнения функции мне возвращается ассоциативный массив, а именно:

Array // <-- Пусть будет $return_array
(
    [0] => Array
        (
            [room_id] => 1
        )

    [1] => Array
        (
            [room_id] => 10
        )

    [2] => Array
        (
            [room_id] => 3
        )
)


Далее я нахожу в этом массиве максимальное значение

$max = max ($return_array)

echo $max['room_id'];


Тут все работает отлично, идем далее...
Я какойто новый массив заполняю значениями:

$new_array = array();
$new_array = range(1, $max['room_id']);  <-- Мб тут как то создать тоже ассициативный ??????.. но КаК ????


И так суть проблемы. Мне надо найти первое вхождение у $new_array[], которого нету у $return_array[]ю Чегото у меня никак не получается....

Мои телодвижения:
чего только не пробовал, остановился пока на этом:

        for ($i = 0; $i < $max['room_id'] - 1; $i++)
        {
            if ($check) break;
            if (!$check)
            {
                if (in_array($new_array[$i], $return_array['room_id'])) $check = false; elseif
                (!in_array($new_array[$i], $return_array['room_id']))  //<-- Тут пробовал в качестве второго
// параметра как с ['room_id'] так и без него
//(т. е. $return_array и $return_array['room_id'])
                {
                    $check = true;
                    $unique_room_id = $new_array[$i];
                }
            }
        }


З.Ы. $unique_room_id = $new_array[$i]; - Ето то первое значение, которого нету в $return_array

Где ошибся, чего не знаю и как сделать ?? Спасибо!
Comments (7)
ava
Aliance | 19.03.2013, 14:23 #
Ключи room_id конечно мешают, их не убрать что ли из $return_array?

Я убрал с помощью array_walk (если нужны - клонируй массив):

<?
echo '<pre>';
$return_array = array(
    array('room_id' => 1),
    array('room_id' => 10),
    array('room_id' => 3),
);
array_walk($return_array, function(&$v) { $v = $v['room_id']; });

$max = max($return_array);
$new_array = range(1, $max);

$diff = array_diff($new_array, $return_array);

echo 'Первое вхождение у $new_array[], которого нету у $return_array[]: ', current($diff);
?>


Но в теории можно написать скрипт еще короче с помощью intersect-функций.
ava
Zorak | 19.03.2013, 14:52 #
Цитата


Ключи room_id конечно мешают, их не убрать что ли из $return_array?



Я убрал с помощью array_walk (если нужны - клонируй массив):



<?

echo '<pre>';

$return_array = array(
  array('room_id' => 1),
  array('room_id' => 10),
  array('room_id' => 3),

);

array_walk($return_array, function(&$v) { $v = $v['room_id']; });



$max = max($return_array);

$new_array = range(1, $max);



$diff = array_diff($new_array, $return_array);



echo 'Первое вхождение у $new_array[], которого нету у $return_array[]: ', current($diff);

?>




Ну вообще да, они нужны и они же по иронии судьбы мешают. Это попробую чуточку поже отпишусь

Цитата


Но в теории можно написать скрипт еще короче с помощью intersect-функций.


Юзал эту функцию с ключами - вообще пустой массив получается на выходе)....

ava
Aliance | 19.03.2013, 14:59 #
Цитата (Zorak @  19.3.2013,  15:52 findReferencedText)
Юзал эту функцию с ключами - вообще пустой массив получается на выходе)....

порядок массивов значит был неправильным. если сделать так, чтобы ключ $return_array был равен room_id (т.е. $return_array[10]['room_id'] = 10), и при генерации следовать этому же правилу - то работать будет.
ava
Zorak | 19.03.2013, 15:09 #
Да, в принципе если убрать индексы то все получилось.... Но как бы хотябы для себя хотелосьбы освоить как обойтись без этого, ну в принципе проблема решена, спасибо большое.
ava
Fortop | 19.03.2013, 17:12 #
Цитата (Zorak @  19.3.2013,  15:09 findReferencedText)
 Но как бы хотябы для себя хотелосьбы освоить как обойтись без этого

Для начала уяснить для себя откуда получился такой return_array

И почему его нельзя было получить в другом виде?
ava
Zorak | 20.03.2013, 10:27 #
Цитата (Fortop @ 19.3.2013,  17:12)
Для начала уяснить для себя откуда получился такой return_array



И почему его нельзя было получить в другом виде?

Массив я получаю как результат исполнения метода моего класса, массив передается мне как ассоциативный, мне они в моей работе очень удобны + я юзаю json_encode & json_decode... вообщем удобно.

Его можно былобы получить в другом виде, но какбы таких ситуаций единицы, когда меня не устраивает ассоциативный массив, но даже в них хотелось бы что нибудь понимать не на уровне школьного 10 класса программирования)
ava
baldina | 20.03.2013, 11:17 #

$return_array = array (
  array('room_id'=>1)
,array('room_id'=>10)
,array('room_id'=>3)
);

function first_hole ($array) {
  uasort($array,function ($a, $b){
    return $a['room_id'] > $b['room_id'];
  });

$prev = 0;
  foreach ($array as $value) {
   if ($prev != 0 && $value['room_id']-$prev > 1)
     return $prev+1;
   $prev = $value['room_id'];
  }
  return 0;
}

echo first_hole($return_array);
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
ava  Aliance   Zorak ava  Fortop   baldina
advanced
Submit