Вставка данных в массив, который находится внутри массива

Так что, возможно, об этом уже спрашивали, или я мог бы использовать массивы совершенно странным образом. Во всяком случае, что я пытаюсь сделать, это иметь один массив, скажем .. $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.

0

Решение

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

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}
0

Другие решения

Вы пытаетесь получить результат из массива, а затем добавить его в новый массив.

Было бы что-то вроде этого:

var result = firstarray.key1;

newarray.push (результат);

0

Извините, должен был заметить, что по знаку доллара

Затем, если вы хотите извлечь поле из массива с помощью PHP, вы хотите сделать это следующим образом

$ Result-> поля [имя_поля] [fieldarray];

Array_push ($ результат);

Надеюсь, я вас правильно понял

0
По вопросам рекламы [email protected]