【问题标题】:Combining PHP array values based on the start of a string根据字符串的开头组合 PHP 数组值
【发布时间】:2019-11-01 05:56:10
【问题描述】:

我有一个看起来像这样的多维 PHP 数组:

[14]=>
  array(2) {
    [0]=>
    int(29)
    [1]=>
    int(129)
  }

[193]=>
  array(3) {
    [0]=>
    int(6009231)
    [1]=>
    int(6324415)
    [2]=>
    int(5682922)
  }

编辑:可以有超过 2 个键(这里是 14 和 193)。可以有 n 个键。

我的目标是在新数组中获取以下字符串:

14:29;193:6009231
14:29;193:6324415
14:29;193:5682922
14:129;193:6009231
14:129;193:6324415
14:129;193:5682922

条件是键、值之间用:分隔,元素用;分隔 第一个元素应该始终是第一个键 (14),然后我们遍历第一个键的值。第二个元素始终是第二个键,我们再次遍历第二个元素的值。 编辑:键总是按升序排序

我设法以所需格式获得所有可能的组合键:值,如下所示:

$properties_values_combinations = []
foreach ($myarray as $property) {
    foreach ($property as $value) {
        $properties_values_combinations[] = (string)$property.":".(string)$value;
    }
}

但是如何根据我想要达到的结果组合这个数组的元素呢?

【问题讨论】:

  • 您的数组将只包含 2 个子数组?或者可以有多个子阵列?如果是,那你怎么知道你必须从哪个索引开始???
  • 是的,只有 2 个子数组。第一层代表属性,第二层代表值(myarray[property][value])
  • 对不起,我误解了 2 个子数组的意思。如果您的意思是 2 是 14 和 193,那么不,可以有 n 个子数组。你开始的索引是最小的。可以升序排列。

标签: php arrays combinations


【解决方案1】:

您可以使用array_keys 提取数组的键,然后使用这些键迭代每个子数组:

$result = array();
list($k1, $k2) = array_keys($myArray);
foreach ($myArray[$k1] as $v1) {
    foreach ($myArray[$k2] as $v2) {
        $result[] = "$k1:$v1;$k2:$v2";
    }
}
print_r($result);

输出:

Array
(
    [0] => 14:29;193:6009231
    [1] => 14:29;193:6324415
    [2] => 14:29;193:5682922
    [3] => 14:129;193:6009231
    [4] => 14:129;193:6324415
    [5] => 14:129;193:5682922
)

Demo on 3v4l.org

更新

如果子数组可以多于2个,则需要使用递归来解决问题。这个函数会做你想做的事:

function list_values($array) {
    $output = array();
    $k1 = array_keys($array)[0];
    if (count($array) == 1) {
        foreach ($array[$k1] as $v1) {
            $output[] = "$k1:$v1";
        }
    }
    else {
        foreach ($array[$k1] as $v1) {
            foreach (list_values(array_slice($array, 1, null, true)) as $k2v2) {
                $output[] = "$k1:$v1;$k2v2";
            }
        }
    }
    return $output;
}

3v4l.org 有 4 个条目数组的演示。输出太长,无法在此处显示。

【讨论】:

  • 谢谢尼克,看起来很整洁。但是,如果我有第三把钥匙或 n 把钥匙,我该怎么办?
  • @VincentTeyssier 在我回答时没有看到该评论。 3 个键的预期输出是什么?
  • 假设第 3 个键为 256:3,我们以第 4 个键为例,即 444:56,那么第一个值输出将为 14:29;193:6009231;256: 3;444:56
  • @VincentTeyssier 看到我的编辑。它包含一个递归函数,可以处理任意数量的子数组。
  • @VincentTeyssier 不用担心 - 一个有趣的问题需要解决。我很高兴能帮上忙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-28
  • 1970-01-01
  • 2020-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多