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

これを行う 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 に答える