4

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

Array (
    [for-juniors] => product_category 
    [for-men] => product_category
    [coats] => product_category
    [for-women] => product_category
    [7-diamonds] => brand
) 

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

array(
    'product_category' => array(
        'for-juniors',
        'for-men',
        'coats',
        'for-women'
    ),
    'brand' => array(
        '7-diamonds'
    )
);
4

2 回答 2

6
$grouped = array();
foreach ($input as $choice => $group) {
    $grouped[$group][] = $choice;
}

var_dump($grouped);
于 2012-09-14T13:23:14.993 回答
0

这会做:

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( $valueof array_keys($array)) 附加到该数组。

这是一个更好理解的示例:

$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_dump,var_export等)输出:

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"
  ]
]

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

于 2021-10-21T12:57:45.813 回答