我在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来检查它的设置,只是出现空值!最佳做法的任何建议都将很受重视。
答案 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
工作方式
首先,我们创建一个可以在这种情况下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"
}
我为其添加了更多的“功能”,希望您不要介意。