2014-09-27 51 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