0

我有一个 php 数组,其中包含从 db 查询返回的邮政编码。邮政编码为德语格式,因此长度为 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),则为 value。邮政编码总是 5 位数,从 00000 到 99999。

非常感谢任何帮助。谢谢。

4

2 回答 2

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 中返回一个数组:

数组('90...'、'904..'、'9041.'、'9042'、'9047.');

每个仅使用一次的范围都将被忽略,并且不会在 $result 数组中返回。

于 2013-10-17T08:56:25.593 回答
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);
于 2013-10-17T08:58:15.423 回答