Так что, возможно, об этом уже спрашивали, или я мог бы использовать массивы совершенно странным образом. Во всяком случае, что я пытаюсь сделать, это иметь один массив, скажем .. $replacements = array();
Этот массив включает в себя все данные ключи а также замены. Не знаю, как это описать, но вот как была взята идея: щелчок — Теперь, скажем, у меня есть этот массив, как указано выше, я пытаюсь использовать внутри своей функции, которая добавляет к массиву, опцию, которая позволяет вам сделать один единственный ключ ограниченным динамическим набором страниц. Вот как я могу представить массив, чтобы выглядеть так:
array() {
["key1"] => "result"["key2"] => "result2"["key3 etc"] => "result3 etc"}
Это был бы массив ключей без каких-либо ограничений страницы, и именно так я себе представляю массив, когда добавляю дополнительные массивы для ключей с ограничением страницы.
array() {
["key1"] => "result"["key2"] => "result2"["key3 etc"] => "result3 etc""homepage" = array() {
["home_key1"] => "this is a key in the homepage only"["two_page_restricted"] => "this is a replacement in two restricted pages only"},
"newspage" = array() {
["two_page_restricted"] => "this is a replacement in two restricted pages only"}
}
Я не уверен, что что-то, что я сказал до сих пор, имеет какой-то смысл, но я думаю, вы поняли картину … Вот что я получил до сих пор для замены основного ключа:
function addTranslation($key, $replacement, $restricted = null) {
if($restricted == null)
array_push($this->translations, $key, $replacement);
//else
//array_push($this->translations, )
}
В конце концов, я пытаюсь сделать то, что если $restricted
не ноль затем добавить из него $this->translations
не мешая другим ключам .. Заранее спасибо за любые усилия по оказанию помощи.
Редактировать:
Если это поможет, вот как я бы использовал функцию:
Для двух страниц:
$class->addTranslation("{key}", "this is a key", array("homepage", "newspage");
Для любой страницы:
$class->addTranslation("{key}", "this is a key");
Edit2:
За разъяснения, это PHP, а не JavaScript.
Чтобы ответить на главный вопрос, метод, который будет обрабатывать передачу данных либо на корневом уровне атрибута массива, либо на нескольких подуровнях этого же массива одновременно, может выглядеть следующим образом:
class EntryHandler
{
private $entries;
function addEntry($key, $value, array $subArrayKeys = null)
{
if($subArrayKeys == null)
{
$this->entries[$key] = $value;
return; // Skip the subArrayKeys handling
}
foreach($subArrayKeys as $subArrayKey)
{
// Initialize the sub array if it does not exist yet
if(!array_key_exists($subArrayKey, $this->entries))
{
$this->entries[$subArrayKey] = [];
}
// Add the value
$this->entries[$subArrayKey][$key] = $value;
}
}
}
При этом вы указали, что эта добавляющая операция не должна «мешать другим ключам». В этом случае способ описания массива, который вы ожидаете, просто не годится. При такой структуре вы не сможете иметь ключ перевода и ограниченное имя страницы с одинаковым значением.
Я думаю, что правильный подход заключается в том, чтобы иметь согласованную структуру, в которой каждый уровень вашего многомерного массива содержит данные одного типа. Учитывая ваш вариант использования, вы можете ввести домен «по умолчанию», который вы будете использовать в качестве основы для своих переводов в дополнение к конкретным переводам для страниц.
Вот небольшой класс, взятый из одного из моих проектов, который я адаптировал под ваш вариант использования, как я понял. Оно использует strtr
как предложено в посте, который вы связали для обработки строки.
class Translator
{
const DEFAULT_DOMAIN = '_default'; // A string that you are forbidden to use as a page specific domain name
const KEY_PREFIX = '{';
const KEY_SUFFIX = '}';
private $translations = [];
public function addTranslation($key, $translation, array $domains = null)
{
// If no domain is specified, we add the translation to the default domain
$domains = $domains == null ? [self::DEFAULT_DOMAIN] : $domains;
foreach($domains as $domain)
{
// Initialize the sub array of the domain if it does not exist yet
if(!array_key_exists($domain, $this->translations))
{
$this->translations[$domain] = [];
}
$this->translations[$domain][$key] = $translation;
}
}
public function process($str, $domain = null)
{
return strtr($str, $this->getReplacePairs($domain));
}
private function getReplacePairs($domain = null)
{
// If the domain is null, we use the default one, if not we merge the default
// translations with the domain specific ones (the latter will override the default one)
$replaceArray = $domain == null
? $this->translations[self::DEFAULT_DOMAIN] ?? []
: array_merge($this->translations[self::DEFAULT_DOMAIN] ?? [], $this->translations[$domain] ?? []);
// Then we add the prefix and suffix for each key
$replacePairs = [];
foreach($replaceArray as $baseKey => $translation)
{
$replacePairs[$this->generateTranslationKey($baseKey)] = $translation;
}
return $replacePairs;
}
private function generateTranslationKey($base)
{
return self::KEY_PREFIX . $base . self::KEY_SUFFIX;
}
}
С этим классом следующий код
$translator = new Translator();
$translator->addTranslation('title', 'This is the default title');
$translator->addTranslation('title', 'This is the homepage title', ['homepage']);
$testString = '{title} - {homepage}';
echo $translator->process($testString, 'random_domain'); // Outputs "This is the default title - {homepage}"echo '<hr/>';
echo $translator->process($testString, 'homepage'); // Outputs "This is the homepage title - {homepage}"
будет выводить:
This is the default title - {homepage}<hr/>This is the homepage title - {homepage}
Вы пытаетесь получить результат из массива, а затем добавить его в новый массив.
Было бы что-то вроде этого:
var result = firstarray.key1;
newarray.push (результат);
Извините, должен был заметить, что по знаку доллара
Затем, если вы хотите извлечь поле из массива с помощью PHP, вы хотите сделать это следующим образом
$ Result-> поля [имя_поля] [fieldarray];
Array_push ($ результат);
Надеюсь, я вас правильно понял