首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >翻转关联数组并将新值存储在子数组中,以防止丢失重复的值

翻转关联数组并将新值存储在子数组中,以防止丢失重复的值
EN

Stack Overflow用户
提问于 2012-09-14 21:21:14
回答 2查看 1.2K关注 0票数 4

我有一个平面关联数组,它可能包含重复的值。

代码语言:javascript
复制
Array (
    [for-juniors] => product_category 
    [for-men] => product_category
    [coats] => product_category
    [for-women] => product_category
    [7-diamonds] => brand
) 

我需要重新构造数据以将原始值存储为新键,并将原始键推入与新键关联的子数组中。

代码语言:javascript
复制
array(
    'product_category' => array(
        'for-juniors',
        'for-men',
        'coats',
        'for-women'
    ),
    'brand' => array(
        '7-diamonds'
    )
);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-14 21:23:15

代码语言:javascript
复制
$grouped = array();
foreach ($input as $choice => $group) {
    $grouped[$group][] = $choice;
}

var_dump($grouped);
票数 6
EN

Stack Overflow用户

发布于 2021-10-21 12:57:46

这样就可以了:

代码语言:javascript
复制
function array_flip_safe(array $array) : array
{
    return array_reduce(array_keys($array), function ($carry, $key) use (&$array) {
        $carry[$array[$key]] ??= []; // PHP 7.0 - ^7.3: $carry[$array[$key]] = $carry[$array[$key]] ?? [];
        $carry[$array[$key]][] = $key;
        return $carry;
    }, []);
}

如果数组不存在,该回调将创建一个空数组。然后将当前迭代的$key ($value of array_keys($array))附加到该数组。

为了更好地理解,这里有一个例子:

代码语言:javascript
复制
$businessHours = [
    'mo' => '13:00 - 16:00',
    'tu' => '8:00 - 12:00',
    'we' => '13:00 - 16:00',
    'th' => '8:00 - 12:00',
    'fr' => '13:00 - 16:00',
    'sa' => '',
    'su' => '',
];

$flipped = array_flip_safe($businessHours);

ray($flipped); (或var_dumpvar_export等)输出:

代码语言:javascript
复制
array:3 [▼
  "13:00 - 16:00" => array:3 [▼
    0 => "mo"
    1 => "we"
    2 => "fr"
  ]
  "8:00 - 12:00" => array:2 [▼
    0 => "tu"
    1 => "th"
  ]
  "" => array:2 [▼
    0 => "sa"
    1 => "su"
  ]
]

请注意,内部数组的值的顺序与原始数组的键的顺序相同。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12425449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档