基于字符串开头组合PHP数组值
我有一个多维PHP数组,如下所示:基于字符串开头组合PHP数组值,php,arrays,combinations,Php,Arrays,Combinations,我有一个多维PHP数组,如下所示: [14]=> array(2) { [0]=> int(29) [1]=> int(129) } [193]=> array(3) { [0]=> int(6009231) [1]=> int(6324415) [2]=> int(5682922) } 编辑:可以有两个以上的键(这里是14和193)。可以有n个键 我的目
[14]=>
array(2) {
[0]=>
int(29)
[1]=>
int(129)
}
[193]=>
array(3) {
[0]=>
int(6009231)
[1]=>
int(6324415)
[2]=>
int(5682922)
}
编辑:可以有两个以上的键(这里是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;
}
}
但是,如何根据我想要实现的结果组合此数组的元素?您可以使用数组\u键
提取数组的键,然后使用这些键迭代每个子数组:
$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
)
更新
如果可以有超过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;
}
演示4个入口阵列在。输出太长,无法在此处显示。您可以使用array\u 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
)
更新
如果可以有超过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;
}
演示4个入口阵列在。输出太长,无法在此处显示。您的数组将只包含2个子数组?或者可以有多个子阵列?如果是,那么您如何知道必须从哪个索引开始???是的,只有2个子数组。第一级表示属性,第二级表示值(myarray[property][value])对不起,我误解了2子数组的含义。如果你的意思是2是14和193,那么不,可以有n个子数组。您开始使用的索引是最小的。它可以升序排序。您的数组将只包含2个子数组吗?或者可以有多个子阵列?如果是,那么您如何知道必须从哪个索引开始???是的,只有2个子数组。第一级表示属性,第二级表示值(myarray[property][value])对不起,我误解了2子数组的含义。如果你的意思是2是14和193,那么不,可以有n个子数组。您开始使用的索引是最小的。它可以按升序排列。谢谢尼克,看起来很整洁。然而,如果我有第三把钥匙,或者n把钥匙,我该怎么办?@VincentTeyssier在我回答时没有看到那个评论。3个键的输出量是多少?假设第三个键是256:3,我们取一个第四个键,例如44个:56个,那么第一个值输出是14:29;193:6009231;256:3;444:56@VincentTeyssier请参阅我的编辑。它包括一个递归函数,可以处理任意数量的子数组。@VincentTeyssier不用担心,这是一个有趣的问题。我很高兴能帮上忙。谢谢尼克,看起来不错。然而,如果我有第三把钥匙,或者n把钥匙,我该怎么办?@VincentTeyssier在我回答时没有看到那个评论。3个键的输出量是多少?假设第三个键是256:3,我们取一个第四个键,例如44个:56个,那么第一个值输出是14:29;193:6009231;256:3;444:56@VincentTeyssier请参阅我的编辑。它包括一个递归函数,可以处理任意数量的子数组。@VincentTeyssier不用担心,这是一个有趣的问题。我很高兴能帮上忙。