我正在尝试找出一种方法,将州名称或地区代码传递给一组销售代表,并让脚本返回该人的 ID。这是一个示例:
$sales_people = array(
'2' => array(
'states' => array('NY', 'NJ', 'CT', 'MA', 'VT', 'ME'),
'codes' => array('CA1', 'US7', 'UT9')
),
'5' => array(
'states' => array('FL', 'GA', 'SC', 'NC', 'TN'),
'codes' => array('VA4', 'VA8', 'VA3')
)
);
如果
$foo = 'VA4'
,我将如何让脚本返回5
?同样,如果$foo = 'NJ'
,我如何让它返回2
?
我正在考虑使用 in_array(),但它似乎不适用于多维数组。
任何见解将非常感激。
如果我理解正确,您想搜索两个键(
states
和codes
)中的值。
如果是这样,这段代码可以完成它:
function sales_search($arr, $needle) {
foreach ($arr as $id => $data) {
if (in_array($needle, $data['states'])) {
return $id;
}
if (in_array($needle, $data['codes'])) {
return $id;
}
}
return false;
}
实例@Ideone.com:http://ideone.com/wmfP2v
echo sales_search($sales_people, 'NJ'); // 2
echo sales_search($sales_people, 'VA4'); // 5
您的干草堆结构不是为高性能搜索而设计的,但您可以使用嵌套循环和早期中断来在多维数组的第三级数据中搜索针。
执行此类强力搜索时,重要的是在找到匹配项时使用
break
或 return
以避免不必要的迭代。
代码:(演示)
function searchSubsets($sets, $needle): ?int
{
foreach ($sets as $id => $haystacks) {
foreach ($haystacks as $haystack) {
if (in_array($needle, $haystack)) {
return $id;
}
}
}
return null;
}
var_export(searchSubsets($sales_people, 'CT'));
如果您要对该数据集执行多次搜索,将其转换为平面关联查找图以便即时访问可能会提高性能。
代码:(演示)
function populateLookup(array $sets): array
{
$lookup = [];
foreach ($sets as $id => $haystacks) {
foreach ($haystacks as $haystack) {
$lookup += array_fill_keys($haystack, $id);
}
}
return $lookup;
}
$map = populateLookup($sales_people);
var_export($map);
echo "\n---\n";
var_export($map['CT'] ?? null);
声明这样的查找映射后,您可以一遍又一遍地引用该数组,而无需进行任何更多的强力搜索。