在多维assoc数组中搜索


Search in a multidimensional assoc 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。我该怎么做?

您可以使用以下命令获取foo的所有keysvalue

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']);

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

试试这个

$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;
}

如果找不到搜索值,此函数将返回关键字或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));

由于问题:我需要值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);

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

$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的值。希望这对你有帮助。

<?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
?>

如果您想通过specific keyvalue获得key,那么您的代码应该是:

function search_array($array, $key, $value)
{
    if(is_array($array[$key])) {
        return array_search($value, $array[$key]);
    }
}
echo search_array($arr, 'tokyo', 'foo');

试试这个:

<?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;

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

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

本例将密钥与$value匹配,但也可以与$k匹配,在本例中为$key2