Проверять массивы с разными ключами? - PullRequest
1 голос
/ 05 июля 2010

Как проверить, существует ли конкретный ключ массива и как их сравнить?

1.Массив выглядит следующим образом.

[33] => Array
               (
                   [211] =>objectr
                       (
                           [name] => Test
                           [id]=>  211
                    )
               )

[23] => Array
               (
                   [311] =>objectr
                       (
                           [name] => Tester
                           [id]=>  311
                    )
               )

2.Массив выглядит так:

   [0] => 311
   [1] => 211
   [2] => 99

Теперь мне нужно сравнить их и получить их идентификатор.

Что-то, что я ищу, - что-то подобное

Ответы [ 4 ]

2 голосов
/ 05 июля 2010

array_key_exists - http://php.net/manual/en/function.array-key-exists.php

foreach($first_array as $arr) {
    foreach($second_array as $key=>$val)
    {
        if (array_key_exists($val, $first_array)) {
            $final_array[$key] = $arr['name'];
        }
    }
}

или array_search - http://uk.php.net/array_search

foreach($first_array as $arr) {
    foreach($second_array as $val)
    {
        $key = array_search($val, $arr);
        if($key !== false) $final_array[$key] = $arr['name'];
    }
}

В обоих случаях вы должны получить:

   [0] => Tester
   [1] => Test
2 голосов
/ 05 июля 2010

Я бы преобразовал Массив 1, как удаление внешнего ключа (по крайней мере, временно), затем, перебирая Массив 2, я сравнил бы преобразованный Массив 1 с array_key_exists.

1 голос
/ 05 июля 2010

Другой подход: мы уменьшаем первый массив до одного измерения:

$first = array();

foreach($first_array as $val) {
   $first[key($val)] = current($val);
}

дает:

Array
(
    [211] => Array
        (
            [name] => Test
            [id] => 211
        )

    [311] => Array
        (
            [name] => Tester
            [id] => 311
        )

)

(я использовал массив вместо объекта, но он работает так же).

и затем мы вычисляем пересечение клавиш:

//assume
$second_array = array(311, 99);

$result = array_intersect_key($first, array_flip($second_array));

, что дает:

Array
(
    [311] => Array
        (
            [name] => Tester
            [id] => 311
        )

)

Так что это не совсем то, что вы хотите, но вы можете легкополучить доступ к свойству name через $element->name.

1 голос
/ 05 июля 2010

Надеюсь, я понял ваш вопрос, возможно, существует языковой барьер, но здесь мы идем:

так что в основном у вас есть 3 массива, и вы хотите использовать последний для проверки первого, чтобы увидеть, существуют ли эти значения / ключи в первом? Ну, первое, что вы хотите сделать, это реструктурировать ваш первый массив во что-то, что можно легко перевести для проверки значений и ключей следующих двух массивов. так что давайте вызовем первый массив $ mapArray:

foreach($mapArray as $mapObject){
    foreach($mapObject as $object){
        $mapList[$object->id] = $object->name;
    }
}

Теперь это должно дать нам что-то вроде:

[211] => 'test'
[311] => 'tester'

Итак, теперь давайте вызовем второй массив $ arrayIds и третий $ arrayNames. Чтобы узнать, существует ли am id, и получить его имя, когда ему дан массив $ arrayIds, все, что вам нужно сделать, это:

//given [0] => 311
$keyExists = array_key_exists(311, $mapList); //returns true is the key exists
echo $mapList[311]; //returns tester, the name for the id given

И наоборот:

//given [0] => 'test'
$nameExists = in_array('test', $mapList);
if($nameExists) echo array_search('test', $mapList); // returns 211

надеюсь, что это то, что вы ищете, или, по крайней мере, поможет вам найти то, что вы ищете.

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