我有一个带有从db查询返回的zipcodes的php数组。邮政编码采用德语格式,因此长5位。
示例:
array ('90475', '90419', '90425', '90415', '90429', '90479', '90485');
我想用占位符将值合并到“范围”,例如:
array ('90...', '904..', '9041.', '9042', '9047.');
//90485 is left out because there is only 1 match.
编辑/逻辑: 这是用于自动提示搜索。尝试构建一个树,以便用户可以搜索匹配任何以90或904等开头的邮政编码的条目。为了使自动完成有意义,我只想提供“9041”。值,如果至少有两个匹配的条目(例如90419和90415)。从00000 - 99999开始,邮政编码总是长5位数。
非常感谢任何帮助。 谢谢。
答案 0 :(得分:1)
你在这里:
$length = 5;
$zip = array('90475', '90419', '90425', '90415', '90429', '90479', '90485');
$result = array();
for ($i = 2; $i <= $length - 1; $i++) {
$pass = array();
foreach ($zip as $val) {
$pass[substr($val, 0, $i)]++;
}
foreach ($pass as $key => $val) {
if ($val > 1) {
$result[] = $key.str_repeat('.', $length - $i);
}
}
}
sort($result);
var_dump($result);
这将在$ result中返回一个数组:
array('90 ...','904 ..','9041。','9042','9047。');
每个只使用一次的范围将被忽略,并且不会在$ result数组中返回。
答案 1 :(得分:0)
$myArray = array ('90475', '90419', '90425', '90415', '90429', '90479', '90485');
$consolidate = array();
foreach($myArray as $zip) {
for ($c = 2; $c < 5; ++$c) {
$key = substr($zip, 0, $c) . str_repeat('.',5 - $c);
$consolidate[$key] = (isset($consolidate[$key])) ? $consolidate[$key] + 1 : 1;
}
}
$consolidate = array_filter(
$consolidate,
function ($value) {
return $value > 1;
}
);
var_dump($consolidate);