将数据推送到阵列内部的数组中

时间:2018-01-28 16:37:50

标签: php arrays dimensions

所以这可能是之前被问过的,或者我可能只是以一种非常奇怪的方式使用数组。无论如何,我尝试做的是拥有一个数组,让我们说.. $replacements = array(); 此数组包含键的所有数据替换。不知道如何描述它,但这就是这个想法的来源:click - 现在,让我们说我已经得到了如上所述的阵列,我&#39 ;我试图在我的函数内部附加到数组,这个选项允许你将一个单独的键限制为一组动态页面。这就是我想象数组的样子:

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 不是 null ,那么将其附加到< em> $this->translations 而不会干扰其他密钥..提前感谢您的任何协助工作。

编辑: 如果它有帮助,这就是我使用该功能的方式:

两页: $class->addTranslation("{key}", "this is a key", array("homepage", "newspage");

对于任何页面: $class->addTranslation("{key}", "this is a key");

EDIT2: 对于澄清,这是PHP而不是JavaScript。

3 个答案:

答案 0 :(得分:0)

您是否尝试从数组中获取结果,然后将其添加到新数组中。

会是这样的:

var result = firstarray.key1;

newarray.push(结果);

答案 1 :(得分:0)

Sorrry应该注意到美元符号

然后,如果你想用PHP从数组中取出一个字段,你想这样做

$ result-&GT;字段[字段名] [fieldarray];

Array_push($结果);

希望我理解正确

答案 2 :(得分: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}