0

我需要想办法将字符串部分匹配到我的 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'];

使用上面的变量,它不会在数组中找到子键,因为子键使用这样的-破折号network-administrator

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

非常感谢您的帮助!

4

2 回答 2

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 
于 2014-09-27T18:56:49.627 回答
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'],等等。

于 2014-09-27T19:03:58.923 回答