【问题标题】:Merge PHP arrays to create named keys and unique values合并 PHP 数组以创建命名键和唯一值
【发布时间】: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_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>lang_read>lang_write,因为"es", "ca", "en"同时存在于lang_readlang_listen中,所以这些应该只存在于lang_listen中,因为它的优先级高于lang_read.

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

【问题讨论】:

  • 你想要的输出示例在这里非常有用,特别是你想如何识别原始数组数据来自于
  • "...引用值最初来自哪个数组的键要求。" 是最让我困惑的部分。一个例子会让你真正受益。
  • @RiggsFolly 我不完全确定说实话。我已经在 HTML 中对此进行了原型化,并构建了一个选择列表,该列表使用带有键名的数据属性(例如 &lt;option value="en" data-type="lang_write"&gt;en&lt;/option&gt;),因此需要构建一个适合生成此输出的数组。如果有的话,您对此有何建议?
  • 查看您认为哪些数据应该到达最终数组仍然很有用(从您提供的示例中)您确实意识到您提到这些数组的 KEYS 是 0,1,2,3 ,4,5,6,7,8,9,10 和 0,1,2,3
  • @El_Vanja 我添加了一个示例,以及我想要的输出。我不完全确定所需的输出是否真正需要,或者是否有更好的方法。

标签: php array-merge array-unique


【解决方案1】:

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

为避免这种情况,您可以在数组上使用简单的+ operation

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

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

【讨论】:

  • 这正是我想要实现的目标。现在我可以做一个foreach $result as $lang =&gt; $type 来实现我想要的选择列表。非常感谢您的见解!
猜你喜欢
  • 2015-12-28
  • 1970-01-01
  • 2013-02-09
  • 2012-09-11
  • 2021-04-10
  • 1970-01-01
  • 2021-02-24
  • 2011-06-12
  • 1970-01-01
相关资源
最近更新 更多