在多维关联数组中搜索

时间:2015-12-22 11:07:29

标签: php multidimensional-array

我有一个数组,看起来像这样:

[lund] => Array
    (
        [69] => foo
    )

[berlin] => Array
    (
        [138] => foox2
    )

[tokyo] => Array
    (
        [180] => foox2
        [109] => Big entrance
        [73] => foo
    )

事情是,有重复的键,所以我重新安排它们,以便我可以更具体地搜索,​​我想。

以前我可以

$key = array_search('foo', $array);

得到密钥,但现在我不知道如何。

问题:我需要来自foo的值为tokyo的密钥。我该怎么做?

9 个答案:

答案 0 :(得分:0)

你需要遍历数组,因为在这种情况下它是2维的。然后找到相应的值。

foreach($arr as $key1 => $key2 ) {
      foreach($key2 as $k => $value) {
        if($value == "foo") {
            echo "{$k} => {$value}";
        }
    }
}

此示例匹配密钥与$value,但您也可以与$k匹配,在这种情况下为$key2

答案 1 :(得分:0)

您可以使用以下内容获取keys的所有valuefoo

foreach ($array as $key => $value) {
    $newArr[$key] = array_search('foo', $value);
}
print_r(array_filter($newArr)); 

结果是:

Array
(
    [lund] => 69
    [tokyo] => 109
)

如果你不介意硬代码,你可以使用它:

array_search('foo', $array['tokyo']);

这只是一个简单的例子,您可以根据您的要求进行修改。

答案 2 :(得分:0)

由于问题:我需要来自tokyo的值foo的键。我该怎么做?

$key = array_search('foo', $array['tokyo']);

作为一项功能:

function getKey($keyword, $city, $array) {
    return array_search($keyword, $array[$city]);
}
// PS. Might be a good idea to wrap this array in an object and make getKey an object method.

如果你想要所有城市(例如循环使用它们):

$cities = array_keys($array);

答案 3 :(得分:0)

试试这个

$a = array(
        "land"=> array("69"=>"foo"),
        "land1"=> array("138"=>"foo1"),
        "land2"=> array('180' => 'foox2',
        '109' => 'Big entrance',
        '73' => 'foo'),
    );
//print_r($a);
$reply = search_in_array($a, "foo");
print_r($reply);


function search_in_array($a, $search)
{
    $result = array();
    foreach($a as $key1 => $array ) {
          foreach($array as $k => $value) {
            if($value == "$search") {
                array_push($result,"{$key1}=>{$k}");
                breck;
            }
        }
    }
    return $result;
}

答案 4 :(得分:0)

如果未找到搜索值,此函数将返回键或null。

function search($searchKey, $searchValue, $searchArr)
{
    foreach ($searchArr as $key => $value) {
        if ($key == $searchKey && in_array($searchValue, $value)) {
            $results = array_search($searchValue, $value);
        }
    }

    return isset($results) ? $results : null;
}
// var_dump(search('tokyo', 'foo', $array));

答案 5 :(得分:0)

试试这个:

<?php
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 'On');


$array=array("lund" => array
(
    69 => "foo"
),

"berlin" => array
(
    138 => "foox2"
),

"tokyo" => array
(
    180 => "foox2",
    109 => "Big entrance",
    73 => "foo"
));



function search($array, $arrkey1, $arrvalue2){

  foreach($array as $arrkey=>$arrvalue){

     if($arrkey == $arrkey1){

      foreach($arrvalue as $arrkey=>$arrvalue){

        if(preg_match("/$arrvalue/i",$arrvalue2))
           return $arrkey;

         }

       }     

     }


   }

   $result=search($array, "tokyo", "foo"); //$array=array; tokyo="inside array to check"; foo="value" to check
   echo $result;

答案 6 :(得分:0)

我使用数组迭代器创建了解决方案。看看下面的解决方案:

$array = array(
    'lund' => array
    (
        '69' => 'foo'
    ),

    'berlin' => array
    (
        '138' => 'foox2'
    ),

    'tokyo' => array
    (
        '180' => 'foox2',
        '109' => 'Big entrance',
        '73' => 'foo'
    )
);

$main_key = 'tokyo'; //key of array
$search_value = 'foo'; //value which need to be search

$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($array));

foreach ($iterator as $key => $value) {
    $keys = array();
    if ($value == $search_value) {
        $keys[] = $key;
        for ($i = $iterator->getDepth() - 1; $i >= 0; $i--) {
            $keys[] = $iterator->getSubIterator($i)->key();
        }

        $key_paths = array_reverse($keys);
        if(in_array($main_key, $key_paths) !== false) {
            echo "'{$key}' have '{$value}' value which traverse path is: " . implode(' -> ', $key_paths) . '<br>';
        }
    }
}

您可以根据参数更改$main_key$serch_value的值。希望这会对你有所帮助。

答案 7 :(得分:0)

<?php
$lund = [
    '69' => 'foo'
];
$berlin = [
    '138' => 'foox2'
];
$tokyo = [
    '180' => 'foox2',
    '109' => 'Big entrance',
    '73' => 'foo'
];
$array = [
    $lund,
    $berlin,
    $tokyo
];

echo $array[2]['180']; // outputs 'foox2' from $tokyo array
?>

答案 8 :(得分:0)

如果您希望keyspecific key获得value,那么您的代码应为:

function search_array($array, $key, $value)
{
    if(is_array($array[$key])) {
        return array_search($value, $array[$key]);
    }
}

echo search_array($arr, 'tokyo', 'foo');