Поиск массива по значениям и ключам возврата - PullRequest
2 голосов
/ 08 декабря 2011

У меня есть значения, переданные c и 3 из переменной $_GET, которые я хочу найти в массиве в качестве значений и получить их ключи. Как я могу искать в массиве, чтобы получить точные ключи?

код ниже

<?php

$array1 = array(0 => 'a', 1 => 'c', 2 => 'c');
$array2 = array(0 => '3', 1 => '2', 2 => '3');

$key1 = array_search('c', $array1);
$key2 = array_search('3', $array2);

?>

возвращает

$key1 = 1;
$key2 = 0;

хотя я ожидаю

$key1 = 2;
$key2 = 2;

Ответы [ 4 ]

4 голосов
/ 08 декабря 2011
foreach ($array1 as $key => $value) {
    if ($value == 'c' && $array2[$key] == '3') {
        echo "The key you are looking for is $key";
        break;
    }
}

Я уверен, что есть более разумный способ сделать то, что вы пытаетесь сделать.

3 голосов
/ 08 декабря 2011

Функция вернулась точно так, как должна была.Первое вхождение значения 'c' существует в индексе 1 в $ array1, а значение '3' имеет первое вхождение в индексе 0 в $ array2

Это поведение описано в документах php на array_search и он даже предоставит вам альтернативу, если вам это не нравится:

Если иголка найдена в стоге сена более одного раза, возвращается первый соответствующий ключ.Чтобы вернуть ключи для всех совпадающих значений, используйте array_keys () с необязательным параметром search_value.

0 голосов
/ 08 декабря 2011

Возможно что-то вроде:

<?php
// for specificly 2 arrays
function search_matching($match1, $match2, array $array1, array $array2) {
    foreach($array1 as $key1 => $value1) {
        // we may want to add $strict = false argument to distinguish between == and === match
        // see http://php.net/manual/en/function.array-search.php
        if($value1 == $match1 and isset($array2[$key1]) and $array2[$key1] == $match2) {
            return $key1;
        }
    }

    return null;
}


// unlimited
function search_matching(array($matches), array $array/*, ...*/) {
    if( count($matches) != func_num_args() - 1)
         throw new \Exception("Number of values to match must be the same as the number of supplied arrays");

    $arrays = func_get_args();
    array_shift($arrays);  // remove $matches
    $array = array_unshift($arrays); // array to be iterated

    foreach($array as $key => $value) {
         if($value == $matches[0]) {
               $matches = true;

               foreach($arrays as $keyA => $valueA) {
                    if(! isset($arrays[$key] or $valueA != $matches[$keyA+1]) {
                        $matches = false;
                        break;
                    }                  
               }

               if($matches)
                   return $key;
         }
    }

    return null;
}

Функции создаются с учетом цифровых клавиш.

Их можно сделать чище, перенеся некоторые функции в другие функции, но я хотел, чтобы они были краткими и вместе, чтобы легко было увидеть, как это работает

0 голосов
/ 08 декабря 2011

Если вы хотите найти последний ключ, который имеет это значение, вы можете сначала перевернуть ваш массив.

$array1 = array(0 => 'a', 1 => 'c', 2 => 'c');
$array2 = array(0 => '3', 1 => '2', 2 => '3');

$key1 = array_search('c', $array1);
$key2 = array_search('3', $array2);

var_dump($key1,$key2); //output: int(1) int(0)


$key1 = array_search('c', array_reverse($array1, true));
$key2 = array_search('3', array_reverse($array2, true));

var_dump($key1,$key2); //output: int(2) int(2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...