合并PHP数组以创建命名键和唯一值

合并PHP数组以创建命名键和唯一值,php,array-merge,array-unique,Php,Array Merge,Array Unique,我有一个包含3个数组的对象,其中任何一个都可能是空的,这三个数组都可能是空的,所以我也需要处理这个需求 下面是该对象的一个示例: { "lang_read": [], "lang_write": ["es", "ca", "zh", "en", "de", "he", "it", "ar&qu

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

下面是该对象的一个示例:

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

我需要使用现有键将这3个数组合并成一个具有唯一值的数组,以便输出包含合并数组来自哪个数组的引用。此外,输出必须优先选择顺序为
lang\u listen
lang\u read
然后
lang\u 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>';
echo';
foreach($namedIndex=>$ArrayValue的语言){
foreach($ArrayValue作为$value){
回显“.$value.”;
}
}
回声';
由于优先级顺序是
lang\u-listen
lang\u-read
lang\u-write
,因为
“es”、“ca”、“en”
lang\u-read
lang\u-listen
中都存在,所以这些应该只存在于
lang\u-listen\code>中,因为它比
lang\u-read
具有优先级


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

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

为了避免这种情况,您可以使用简单覆盖阵列:

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

<?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
)
*/

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

为了避免这种情况,您可以使用简单覆盖阵列:

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

<?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
)
*/

您想要的输出示例在这里非常有用,特别是您想要如何识别原始数组数据来自“…引用值最初来自哪个数组的键要求”是最让我困惑的部分。举个例子真的会对你有好处。@RiggsFolly我不能完全肯定你是诚实的。我已经用HTML制作了原型,并构建了一个选择列表,该列表使用带有键名的数据属性(例如,
en
),因此需要构建一个适合生成此输出的数组。如果有什么建议的话,您可以提出什么建议?查看您认为哪些数据应该到达最终数组(从您给出的示例中)仍然很有用。您确实意识到您提到的这些数组的键是0,1,2,3,4,5,6,7,8,9,10和0,1,2,3@El_Vanja我添加了一个示例,以及我想要的输出。我不完全确定所需的输出是否确实是所需的,或者是否有更好的方法。这里有一个您想要的输出示例非常有用,特别是您想如何识别哪些原始数组数据来自“…引用值最初来自哪个数组的键要求。”是最让我困惑的部分。举个例子真的会对你有好处。@RiggsFolly我不能完全肯定你是诚实的。我已经用HTML制作了原型,并构建了一个选择列表,该列表使用带有键名的数据属性(例如,
en
),因此需要构建一个适合生成此输出的数组。如果有什么建议的话,您可以提出什么建议?查看您认为哪些数据应该到达最终数组(从您给出的示例中)仍然很有用。您确实意识到您提到的这些数组的键是0,1,2,3,4,5,6,7,8,9,10和0,1,2,3@El_Vanja我添加了一个示例,以及我想要的输出。我不完全确定所期望的输出是否真的是所期望的,或者是否有更好的方法。这正是我想要实现的。现在,我可以将
foreach$结果作为$lang=>$type
来实现所需的选择列表。非常感谢您的见解!这正是我希望实现的目标。现在,我可以将
foreach$结果作为$lang=>$type
来实现所需的选择列表。非常感谢您的见解!