合并 PHP 个数组以创建命名键和唯一值
Merge PHP arrays to create named keys and unique values
我有一个包含 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 select 列表中,以便最终用户只有 select 一个选项。
我尝试这样做,并设法合并数组以获得唯一值,但我坚持排序要求,以及引用值最初来自哪个数组的键要求如下:
$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 select 列表,例如:
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
,因为lang_read
和lang_listen
都存在"es", "ca", "en"
,这些应该只存在于 lang_listen
中,因为它优先于 lang_read
.
谁能告诉我最好的方法是什么以及如何实现它?谢谢!
如果输入数组有数字键array_merge将对输出数组重新编号。
为了避免这种情况,您可以对数组使用简单的 +
operation:
如果左操作数数组中存在key,则不会从右操作数中添加。
<?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
)
*/
我有一个包含 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 select 列表中,以便最终用户只有 select 一个选项。
我尝试这样做,并设法合并数组以获得唯一值,但我坚持排序要求,以及引用值最初来自哪个数组的键要求如下:
$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 select 列表,例如:
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
,因为lang_read
和lang_listen
都存在"es", "ca", "en"
,这些应该只存在于 lang_listen
中,因为它优先于 lang_read
.
谁能告诉我最好的方法是什么以及如何实现它?谢谢!
如果输入数组有数字键array_merge将对输出数组重新编号。
为了避免这种情况,您可以对数组使用简单的 +
operation:
如果左操作数数组中存在key,则不会从右操作数中添加。
<?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
)
*/