Php 如何在一个数组中允许相同的键?

Php 如何在一个数组中允许相同的键?,php,Php,我需要向数组中添加相同的键,但值不同 foreach ($selections as $selection) { $array += [$selection['option_id']=>$selection['product_id']]; } //示例输出 $array = [30=>12,14=>10], 但事实上应该是这样 [30=>7,30=>12,14=>10]; 当按键重复时,它会合并。你就是不能 但是您可以将该键的值设置为数组 所以

我需要向数组中添加相同的键,但值不同

foreach ($selections as $selection) {
    $array += [$selection['option_id']=>$selection['product_id']];
}
//示例输出

$array = [30=>12,14=>10], 
但事实上应该是这样

[30=>7,30=>12,14=>10];
当按键重复时,它会合并。

你就是不能

但是您可以将该键的值设置为数组

所以你会有

$array = [30=>[7,12],14=>10];
您可以在$array[30]上使用任何数组函数。

您就是不能

但是您可以将该键的值设置为数组

所以你会有

$array = [30=>[7,12],14=>10];

您可以在$array[30]上使用任何数组函数。

您应该做的是将产品ID作为数组返回:

$array = array_reduce($selections, function ($carry, $selection) {
    if (!isset($carry[$selection['option_id']])) {
        $carry[$selection['option_id']] = [];
    }

    $carry[$selection['option_id']][] = $selection['product_id'];

    return $carry;
}, []);
现在的结果是:

[30 => [7, 12], 14 => [10]];

您应该做的是将产品ID作为数组返回:

$array = array_reduce($selections, function ($carry, $selection) {
    if (!isset($carry[$selection['option_id']])) {
        $carry[$selection['option_id']] = [];
    }

    $carry[$selection['option_id']][] = $selection['product_id'];

    return $carry;
}, []);
现在的结果是:

[30 => [7, 12], 14 => [10]];

正如单词本身所说,数组中的键是访问它们包含的值的键,每个键必须是唯一的,否则您将无法访问。如果可以有两个或两个以上相同的值,您如何判断哪个将访问一个值,哪个将访问另一个值?要解决您的问题,您有一种方法:生成一个多维数组,这样您就可以在一个键的“后面”存储多个值。例如[30=>7,12],14=>10] 根据您的代码,您可以创建一个带有嵌套foreach的双循环,以浏览所有值,如:

foreach ($selections as $selection) {
 if(!is_array($selection['product_id'])  $array += [$selection['option_id']=>$selection['product_id']];
 else { 
     foreach ($selection['product_id'] as $product) {
          $array += [$selection['option_id']=> product];
      }
  }
}

正如单词本身所说,数组中的键是访问它们包含的值的键,每个键必须是唯一的,否则您将无法访问。如果可以有两个或两个以上相同的值,您如何判断哪个将访问一个值,哪个将访问另一个值?要解决您的问题,您有一种方法:生成一个多维数组,这样您就可以在一个键的“后面”存储多个值。例如[30=>7,12],14=>10] 根据您的代码,您可以创建一个带有嵌套foreach的双循环,以浏览所有值,如:

foreach ($selections as $selection) {
 if(!is_array($selection['product_id'])  $array += [$selection['option_id']=>$selection['product_id']];
 else { 
     foreach ($selection['product_id'] as $product) {
          $array += [$selection['option_id']=> product];
      }
  }
}

在一个数组中不能有两个相同的键,因此“应该是”的示例是不可能的。从技术上讲,您想要的是不可能的。不过,您可以将值存储为一个数组,只需一个键即可。而
$array[30]
将返回什么?7.12?[30=>7,30=>12,14=>10]; ... 你可以这样做[30=>7/12,14=>10];然后用“/”或任何你喜欢的词来分解价值观,这有帮助吗?我认为这是一个需要重新思考战略的好例子。大多数情况下,如果你找不到一个相当简单的答案,你可能不应该这样做。你不能在一个数组中有两个相同的键,因此你的“应该是”示例是不可能的。你想要的从技术上讲是不可能的。不过,您可以将值存储为一个数组,只需一个键即可。而
$array[30]
将返回什么?7.12?[30=>7,30=>12,14=>10]; ... 你可以这样做[30=>7/12,14=>10];然后用“/”或任何你喜欢的词来分解价值观,这有帮助吗?我认为这是一个需要重新思考战略的好例子。大多数时候,如果你找不到一个相当简单的答案,你可能不应该这么做。