需要在foreach循环中添加字符串部分匹配查找数组键

时间:2014-09-28 18:21:09

标签: php arrays regex string multidimensional-array

我有一些PHP代码,它从传入的字符串中删除-短划线。数组键在每个单词之间可以有或没有-。因此,如果字符串有空格或短划线,则字符串仍然与键匹配。

现在我需要稍微扩展一下以使部分匹配找到数组中的键。

这是我到目前为止所拥有的。

我的阵列

$pages = array(

'Administrator' => array(
    'network-administrator' => array('title' => 'Network '.$li_1, 'description' => 'Network '.$li_1.' '.$temp_content, 'post' => '<p>Network '.$li_1.' '.$temp_content.'.</p>'),
    'database administrator' => array('title' => 'Database '.$li_1, 'description' => 'Database '.$li_1.' '.$temp_content, 'post' => '<p>Database '.$li_1.' '.$temp_content.'.</p>'),
),

'Analyst' => array(
    'business systems analyst' => array('title' => 'Business Systems '.$li_2, 'description' => 'Business Systems '.$li_2.' '.$temp_content, 'post' => '<p>Business Systems '.$li_2.' '.$temp_content.'.</p>'),
    'data-analyst' => array('title' => 'Data '.$li_2, 'description' => 'Data '.$li_2.' '.$temp_content, 'post' => '<p>Data '.$li_2.' '.$temp_content.'.</p>'),
),

);

PHP foreach循环

$t_keys = array();

foreach ($pages as $k => $arr2) {
    foreach (array_keys($arr2) as $a) {
        $new_key = str_replace("-", " ", $a);
        $t_keys[$new_key] = array( $k, $a );
    }
}
$str = str_replace(array('-', ' and '), ' ', strtolower($position));
if (array_key_exists($str, $t_keys)) {
    $target = $pages[ $t_keys[$str][0] ][ $t_keys[$str][1] ];
}

$t_keys[$str][0]访问密钥Administrator$t_keys[$str][1]访问子密钥network-administrator

我需要做的是匹配URL中查询字符串的传入字符串,以查找数组子键中的匹配项。

进入的部分匹配字符串示例为oracle database administrator。该密钥不在我的数组中,但是oracle administrator以及database administrator

那么,如果存在相似的词,我如何匹配进入数组子键的字符串?

以下是错误日志中的传入部分匹配字符串的小列表。

it 
apple 
css 
.net developer
desktop 
.net 
python 
apple 
data center 
phone technician
sql database developer
jquery
delphi
css
python
pc
software
xml
webmaster
research development
python programming
computer technician or pc technician
.net
c  

在某些情况下,上述部分匹配不存在于数组中的任何位置。我正在对这些进行重定向。但是其他诸如data centerpython programming之类的例子都在数组中。

字符串data center的示例,数组中最接近的匹配为data center technician,字符串python programming的最接近匹配为python developer

所有帮助表示赞赏!

修改

为了清楚起见,这里有一些关于部分匹配的更多信息,这将是一个问题。

是的,我知道有些比赛会比其他比赛更棘手。在我的数组中,没有名为programming的密钥,但有一个名为developer的密钥,因此字符python programming可以放在子密钥python developer中,因为它是子密钥开发人员密钥。

其他如字符串data center会比较复杂,因为主键的几个子键有data center字。

让我们以字符串computer technician or pc technician为例。这不再是我的数组中的子键。但是有一些名为computer technician的子键以及pc technician。如果字符串中存在两个子键,哪一部分匹配?

如果我现在可以获得一些基本的东西,至少会处理一些部分匹配,那么我就在正确的轨道上。

编辑2

这是字符串business analyst的另一个示例。我的数组中有一个名为business systems analyst的子键。单词businessanalyst都是子键中的单词。所以我需要创建一些我可以继续添加的东西,每当一个新的字符串进入时,在数组中没有正确匹配。

编辑3

在思考了几分钟之后,我认为最好的方法是手动添加进入数组的每个部分字符串并将其引用到我选择的子键中。

oes有意义吗?

所以我需要创建一个php片段,我不断添加到指向数组中键的部分匹配字符串的数组容器中。我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

我根据您的要求写了一个单词匹配。因此,network会与network whatever stuff goes here匹配,因为它包含network等等...我不确定它是否是您想要的,但也许它是&#39;我会帮你的。

class PageWalker{
    public $pages = null;
    public function __construct($pages){
        return $this->pages = $pages;
    }

    public function clean_str($str){
        return strtolower(preg_replace('/[-_\~\!@#\$\%\^\&\*\(\)]/', ' ', $str));
    }

    public function get_results($input=false){
        $results = array();
        foreach($this->pages as $page => $arr):
            foreach($arr as $i => $v):
                if(in_array($this->clean_str($input), explode(' ', $this->clean_str($i)))):
                    $results[$i] = $v;
                endif;
            endforeach;
        endforeach;
        return $results;
    }
}

$walk = new PageWalker($pages);

print_r($walk->get_results('network'));

Here's an eval.in example