首页 > 解决方案 > 合并 PHP 数组以创建命名键和唯一值

问题描述

我有一个包含 3 个数组的对象,其中任何一个都可能为空,这三个数组都可以为空是可行的,所以我也需要处理这个要求。

这是对象的示例:

{
    "lang_read": [],
    "lang_write": ["es", "ca", "zh", "en", "de", "he", "it", "ar", "ko", "pt", "ru"],
    "lang_listen": ["es", "ca", "en", "fr"]
}

我需要使用现有的键将这 3 个数组合并为具有唯一值的单个数组,以便输出包含对合并数组来自哪个数组的引用。此外,输出必须优先选择顺序为 的数组lang_listenlang_read然后是lang_write

输出应允许将这些内容列在 HTML 选择列表中,以便最终用户只选择一个选项。

我尝试这样做,并设法合并数组以获得唯一值,但我坚持排序要求,以及引用值最初来自哪个数组的键要求如下:

$mergedLanguages = array_unique(array_merge($languages->lang_listen, $languages->lang_read, $languages->lang_write), SORT_REGULAR);

但是,这只是产生了一个带有数字键的新数组,我无法引用该值最初来自哪个数组。

作为所需输出的示例,这可能完全不正确:

{
    "languages": [
        "lang_listen" => array("es", "ca", "en", "fr"), 
        "lang_write" => array("zh", "de", "he", "it", "ar", "ko", "pt", "ru")
    ]
}

然后我发现需要从中构建一个 HTML 选择列表,例如:

echo '<select>';
foreach ($languages as $namedIndex => $arrayValues) {
   foreach ($arrayValues as $value) {
      echo '<option value="'.$value.'" data-type="'.$namedIndex.'">'.$value.'</option>';
   }
}
echo '</select>';

因为优先级的顺序是lang_listen>> ,同时存在于and中,所以这些应该只存在于它的优先级之上lang_readlang_write"es", "ca", "en"lang_readlang_listenlang_listenlang_read

谁能建议什么是最好的方法以及如何实现它?谢谢!

标签: phparray-mergearray-unique

解决方案


如果输入数组有数字键, array_merge将对输出数组重新编号。

为避免这种情况,您可以对数组使用简单的+操作:

如果左操作数数组中存在键,则不会从右操作数添加它。

<?php
$lang_read = [];
$lang_write = ["es", "ca", "zh", "en", "de", "he", "it", "ar", "ko", "pt", "ru"];
$lang_listen = ["es", "ca", "en", "fr"];

$result = $lang_listen + $lang_read  + $lang_write;

print_r($result);

/*
Array
(
    [0] => es
    [1] => ca
    [2] => en
    [3] => fr
    [4] => de
    [5] => he
    [6] => it
    [7] => ar
    [8] => ko
    [9] => pt
    [10] => ru
)
*/

但它仍然没有为您提供有关物品来自何处的信息。要获取该信息,您可以重新排列数组,因此语言代码将位于键中,而值将存储源。

您可以使用array_fill_keys来做到这一点。


<?php
$lang_read = ["he", "en"];
$lang_write = ["es", "ca", "zh", "en", "de", "he", "it", "ar", "ko", "pt", "ru"];
$lang_listen = ["es", "ca", "en", "fr"];

$result = array_fill_keys($lang_listen, 'listen')
        + array_fill_keys($lang_read, 'read')
        + array_fill_keys($lang_write, 'write');

print_r($result);

/*

Array
(
    [es] => listen
    [ca] => listen
    [en] => listen
    [fr] => listen
    [he] => read
    [zh] => write
    [de] => write
    [it] => write
    [ar] => write
    [ko] => write
    [pt] => write
    [ru] => write
)
*/

推荐阅读