从多维数组PHP中搜索和检索

时间:2018-10-26 07:46:29

标签: php arrays

我在PHP中有一个多维数组,我试图搜索一个特定值(url),然后检索一个关联值(value)。如果找不到,我还需要转移到其他地方。

array(2) { 
  [0]=> array(2) { 
    ["url"]=> string(7) "fareham" 
    ["value"]=> string(7) "Fareham" 
  } 

 [1]=> array(2) { 
    ["url"]=> string(11) "southampton" 
    ["value"]=> string(11) "Southampton" 
  } 
}

我一直在尝试使用array_key_exists和isset来检查它的设置,只是出现空值!最佳做法的任何建议都将很受重视。

2 个答案:

答案 0 :(得分:5)

使用array_column()通过url列对数据进行索引,然后使用isset()检查该值是否存在...

$data = array_column($data, "value", "url");
$search = 'southampton';

$value = isset($data[$search])?$data[$search]:"not found";

echo $value;

或者对于PHP 7+,您可以使用null coalescing operator (??)

$value = $data[$search]??"not found";

答案 1 :(得分:1)

这是执行此操作的最小方法(无检查)

$a = array (
    0 => 
    array (
        "url" => 'fareham',
        "value" => 'Fareham'
    ),
    1 => 
    array (
        "url" => 'southampton',
        "value" => 'Southampton'
    )
);

$u = 'fareham';
$i = $a[false===($f=array_search($u,array_column($a,'url')))?-1:$f]['value'];
print_r($i);

输出

Fareham

Sandbox

工作方式

首先,我们创建一个可以在这种情况下url要搜索的列上使用array_column搜索的数组。看起来像这样[0=>'fareham', 1=>'southampton']

然后,如果您注意到上面的索引与原始数组相关,则使用普通的array_search返回索引。这意味着我们可以将其作为顶级密钥,然后只需添加所需的密钥即可。

因为array_search可以返回一个布尔值(false),PHP将其视为0或我为此添加了一些技巧的第一个索引。但是更好的方法是像这样检查它:     $ a =数组(         0 =>         数组(             “ url” =>'fareham',             “ value” =>'Fareham',             “额外” =>'Foo'         ),         1 =>         数组(             “ url” =>'southampton',             “ value” =>'Southampton',             “额外” =>'酒吧'         )     );

function serchMultiDimensionalValue($needle, $haystack, $fields='value'){
   if(false === ($f=array_search($needle,array_column($haystack,'url')))) return false; //or return [];

   if(!is_array($fields)) $fields = [$fields];

   return array_intersect_key($haystack[$f], array_flip($fields));
}


var_dump(serchMultiDimensionalValue('foo',$a));
var_dump(serchMultiDimensionalValue('fareham',$a));
var_dump(serchMultiDimensionalValue('fareham',$a, 'extra'));
var_dump(serchMultiDimensionalValue('fareham',$a, ['extra','url']));

输出

bool(false)
array(1) {
  ["value"]=>
  string(7) "Fareham"
}
array(1) {
  ["extra"]=>
  string(3) "Foo"
}
array(2) {
  ["url"]=>
  string(7) "fareham"
  ["extra"]=>
  string(3) "Foo"
}

Sandbox

我为其添加了更多的“功能”,希望您不要介意。