сравнить строку со значением дополнительного ключа в частичном совпадении массива 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'];

с вышеуказанной переменной он не найдет вложенный ключ в массиве, потому что вложенный ключ использует - тире как это network-administrator,

Итак, как бы я получить значение массива, включая исходный подраздел, и вернуть его содержимое, используя строку с пробелом вместо тире, вот так, network administrator?

Большое спасибо за помощь!

0

Решение

Вот один из способов сделать это: переназначить исходные ключи в новый массив, содержащий раздетые ключи, и сохранить исходный ключ в значении массива.

$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'], и так далее.

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
1