【发布时间】:2020-12-10 13:07:05
【问题描述】:
我有一个包含 3 个数组的对象,其中任何一个可能为空,三个都可以为空是可行的,所以我也需要处理这个要求。
这是一个对象的例子:
{
"lang_read": [],
"lang_write": ["es", "ca", "zh", "en", "de", "he", "it", "ar", "ko", "pt", "ru"],
"lang_listen": ["es", "ca", "en", "fr"]
}
我需要使用现有的键将这 3 个数组合并为一个具有唯一值的数组,以便输出包含对合并数组来自哪个数组的引用。此外,输出必须首选数组,顺序为lang_listen、lang_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>lang_read>lang_write,因为"es", "ca", "en"同时存在于lang_read和lang_listen中,所以这些应该只存在于lang_listen中,因为它的优先级高于lang_read.
谁能建议什么是最好的方法以及如何实现它?谢谢!
【问题讨论】:
-
你想要的输出示例在这里非常有用,特别是你想如何识别原始数组数据来自于
-
"...引用值最初来自哪个数组的键要求。" 是最让我困惑的部分。一个例子会让你真正受益。
-
@RiggsFolly 我不完全确定说实话。我已经在 HTML 中对此进行了原型化,并构建了一个选择列表,该列表使用带有键名的数据属性(例如
<option value="en" data-type="lang_write">en</option>),因此需要构建一个适合生成此输出的数组。如果有的话,您对此有何建议? -
查看您认为哪些数据应该到达最终数组仍然很有用(从您提供的示例中)您确实意识到您提到这些数组的 KEYS 是 0,1,2,3 ,4,5,6,7,8,9,10 和 0,1,2,3
-
@El_Vanja 我添加了一个示例,以及我想要的输出。我不完全确定所需的输出是否真正需要,或者是否有更好的方法。
标签: php array-merge array-unique