2014-09-27 75 views
0

我需要找出一种方法将字符串部分匹配到我的PHP数组中的子键。比较字符串与PHP数组部分匹配中的子键值

例如:

string = howdy-doody show,你可以看到有一个-破折号和词之间的空间。在我的PHP数组中,子密钥可能是howdy doody show而没有破折号,或者它可能是howdy doody-show,而字符串中的另一个单词之间有破折号。

如何在给定的字符串中找到数组中的子键?

样本阵列

$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>'), 
), 

); 

样本串

network administrator 

样品变量定位数组值

$content = $pages['Administrator']['network administrator']; 

与上述可变它将找不到苏b键,因为子键使用-短划线,如network-administrator

那么如何获得包含原始子项的数组值,并使用具有空格的字符串返回其内容,而不是像这样,network administrator

非常感谢您的帮助!

+0

将所有可能的特殊字符替换为您比较的字符串中的空格和您接受比较的字符串,但仍然打印返回的值,但不会替换任何内容。 – Ohgodwhy 2014-09-27 18:41:53

+0

是的,这是我想要做的。我已经删除了字符串之间的所有空格的字符串。那么我该如何编写上面的变量来查找数组中有特殊字符的子键呢? – Mike 2014-09-27 18:44:38

+0

或者使用带'.'的正则表达式代替空格/有趣的字符,或者从数组键中去除有趣的字符。 – 2014-09-27 18:47:12

回答

1

下面是做到这一点的一种方法:重新映射你原来的键包含剥离键一个新的数组,并将原始密钥存储在数组的值中。

$t_keys = array(); 

foreach ($pages as $k => $arr2) { 
    foreach (array_keys($arr2) as $a) { 
     // perform whatever transformations you want on the key here 
     $new_key = str_replace("-", " ", $a); 
     // use the transformed string as the array key; 
     // we still need to access the data in the original array, so store the outer 
     // array key ("Administrator", "Analyst", etc.) and the inner array key 
     // ("network-administrator", etc.) in a subarray. 
     $t_keys[$new_key] = array($k, $a); 
    } 
} 

$t_keys示例键 - 值对:

$t_keys['network administrator'] = ['Administrator', 'network-administrator'] 

要原始数组中访问该值,我们需要得到$pages['Administrator']['network-administrator'],或使用来自$t_keys等效值:$pages[ $t_keys['network administrator'][0] ][ $t_keys['network administrator'][1] ]

来匹配搜索字符串:

$str = str_replace("-", " ", $original_search_string_from_url); 

// check if it's in the transformed keys array 
if (array_key_exists($str, $t_keys)) { 
    // now we can access the data from our $pages array! 
    $target = $pages[ $t_keys[$str][0] ][ $t_keys[$str][1] ]; 
    echo "the proper name for $str is " . $t_keys[$str][1] . "\n"; 
// output: "the proper name for network administrator is network-administrator" 

    // access various attributes of the network-administrator: 
    echo "the title of $str is " . $target['title']; 
} 

如果你不需要知道什么$pages的键(例如,“管理员”和“网络管理员”),只是想获得连胜到相关数据,您可以创建引用而不是存储密钥。这里有一个例子:

$refs = array(); 

foreach ($pages as $k => $arr2) { 
    foreach (array_keys($arr2) as $a) { 
     // perform whatever transformations you want on the key here 
     $new_key = str_replace("-", " ", $a); 
     // create a reference (=&) to the contents of $pages[$k][$a] 
     // $refs[$new_key] points directly at $pages[$k][$a] 
     $refs[$new_key] =& $pages[$k][$a]; 
    } 
} 

现在$refs['network administrator']就像一个快捷方式$pages['Administrator']['network-administrator']; $refs['network administrator']['post']访问$pages['Administrator']['network-administrator']['post'],依此类推。

+0

引用看起来很酷,使用较少的代码,并且不需要来自第一个示例的代码的字符串检查器部分,我正确吗? – Mike 2014-09-27 21:56:59

+0

给你一个问题。它工作得很好btw。我试图从你的foreach循环访问数组中值的剥离字符版本。我无法弄清楚。我知道如何通过使用'$ t_keys [$ str] [1]'来获得正确的一个,但是我用什么来访问同一个数组键的剥离版本? – Mike 2014-09-28 02:53:14

+0

被剥离的版本将是'$ str'。如果您想要使用剥离版本,则可以将其添加到嵌套数组中的数据 - 例如在设置查找表'$ t_keys'或'$ refs'的循环中,您可以(在'$ refs'版本中):'$ refs [$ new_key] =&$ pages [$ k] [$ a ]。 $ pages [$ k] [$ a] ['stripped-key'] = $ new_key;'。 – 2014-09-28 16:47:44

1

这里是一个使用递归和得到你传递给它的,但新的键数组的函数:

function getArr($arr, $reg, $char) 
{ 
    foreach ($arr as $key => $value) { 
     if (is_array($value)) 
      $newArray[preg_replace($reg, $char, $key)] = getArr($value, $reg, $char); 
     else 
      $newArray[preg_replace($reg, $char, $key)] = $value; 
    } 
    return $newArray; 
} 

例子:

首先,您需要得到你的新的磁盘阵列,在这种情况下,我们想在按键改变:“_”和“ - ”空间:

$newPages = getArr($pages, '/_|-/', ' '); 

,然后使用我们新的数组:

$content = $newPages['Administrator']['network administrator']; 

例子,你的情况:

<?php 
function getArr($arr, $reg, $char) 
{ 
    foreach ($arr as $key => $value) { 
     if (is_array($value)) 
      $newArray[preg_replace($reg, $char, $key)] = getArr($value, $reg, $char); 
     else 
      $newArray[preg_replace($reg, $char, $key)] = $value; 
    } 
    return $newArray; 
} 
$pages = array(

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

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

); 

$content = getArr($pages, '/_|-/', ' ')['Administrator']['network administrator']['title']; 
echo $content; 

输出

Network 
+0

如何写我的变量'$ content = $ pages ['Administrator'] ['network administrator'];'它使用你的函数? – Mike 2014-09-27 19:03:46