Php 基于键从动态关联数组生成二进制配对数组,每个键一个元素
我基本上是从一个动态关联数组中创建Pair,这样我从一个键数组中取一个元素,从另一个键数组中取另一个元素,这两个元素在这个键数组上组合,形成Pair 1。问题是,这是一个动态关联数组,它可以有4个键,每个键的数组中可以有最大两个元素,最小一个元素,为了配对,我们应该有两个键,在这两个键数组的两侧各有一个元素。 比如说Php 基于键从动态关联数组生成二进制配对数组,每个键一个元素,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,我基本上是从一个动态关联数组中创建Pair,这样我从一个键数组中取一个元素,从另一个键数组中取另一个元素,这两个元素在这个键数组上组合,形成Pair 1。问题是,这是一个动态关联数组,它可以有4个键,每个键的数组中可以有最大两个元素,最小一个元素,为了配对,我们应该有两个键,在这两个键数组的两侧各有一个元素。 比如说 [parent_id] => Array ( [9] => Array
[parent_id] => Array
(
[9] => Array
(
[0] => 11
[1] => 12
)
[10] => Array
(
[0] => 13
[1] => 14
)
[20] => Array
(
[0] => 21
[1] => 22
)
[21] => Array
(
[0] => 23
)
)
这是一个关联数组,现在提供3对。
例如
第1对包含:11、13
第2对包含:12、14
第3对包含:21、23
现在的问题是通过使用什么方法我可以得到我想要的结果。
有什么建议吗 更新3 上次更新没有找到一个案例的所有可能的对。这个版本以不同的方式循环,在移动到下一个数组并从中配对之前,从每个数组中最多提取一个元素。它会循环,直到没有足够的值可以配对为止
function find_pairs($array) {
// re-index to 0
$array = array_values($array['parent_id']);
// sort so the longest arrays are first
usort($array, function ($a, $b) { return count($b) - count($a); });
// output array
$pairs = array();
$c = count($array);
$i = 0;
// loop while there are enough values to pair (2 or more)
while (array_reduce($array, function ($c, $v) { return $c + count($v); }, 0) > 1) {
// make sure there are some elements in this array
while (!count($array[$i])) $i = ($i + 1) % $c;
// find the next array with a value
$j = ($i + 1) % $c;
while (!count($array[$j])) $j = ($j + 1) % $c;
// have we come full circle?
if ($j == $i) break;
// save the pair
$pairs[] = array(array_shift($array[$i]), array_shift($array[$j]));
// move on to the next array
$i = ($i + 1) % $c;
}
return $pairs;
}
原始答案
这里有一种方法可以做到这一点。重新索引parent\u id
数组,使其从0开始,然后一次遍历数组2个元素,合并每个元素的所有值。我们使用min
来确保我们只对最小值数组中的值进行配对
// re-index to 0
$array = array_values($array['parent_id']);
// output array
$pairs = array();
for ($i = 0; $i < count($array) - 1; $i += 2) {
for ($j = 0; $j < min(count($array[$i]), count($array[$i+1])); $j++) {
$pairs[] = array($array[$i][$j], $array[$i+1][$j]);
}
}
print_r($pairs);
更新
如果要保证从阵列中获得最大数量的对,请进行排序,使最长的阵列排在第一位:
$array = array_values($array['parent_id']);
// sort so the longest arrays are first
usort($array, function ($a, $b) { return count($b) - count($a); });
// output array
$pairs = array();
for ($i = 0; $i < count($array) - 1; $i += 2) {
for ($j = 0; $j < min(count($array[$i]), count($array[$i+1])); $j++) {
$pairs[] = array($array[$i][$j], $array[$i+1][$j]);
}
}
print_r($pairs);
$array=array\u值($array['parent\u id']);
//排序,使最长的数组排在第一位
usort($array,function($a,$b){返回计数($b)-count($a);});
//输出阵列
$pairs=array();
对于($i=0;$i
更新2
根据进一步的评论,配对的唯一要求似乎是元素来自的数组的键不同。这使事情变得有点复杂,但此函数应该满足您的要求:
function find_pairs($array) {
// re-index to 0
$array = array_values($array['parent_id']);
// sort so the longest arrays are first
usort($array, function ($a, $b) { return count($b) - count($a); });
// output array
$pairs = array();
for ($i = 0, $j = 1; $i < count($array) - 1; $i++) {
if (!count($array[$i])) continue;
while ($j <= $i || $j < count($array) && !count($array[$j])) $j++;
while (count($array[$i]) && isset($array[$j]) && count($array[$j])) {
$pairs[] = array(array_shift($array[$i]), array_shift($array[$j]));
// exhausted other arrays elements?
while ($j < count($array) && !count($array[$j])) $j++;
}
}
return $pairs;
}
函数查找\u对($array){
//重新索引为0
$array=array_值($array['parent_id']);
//排序,使最长的数组排在第一位
usort($array,function($a,$b){返回计数($b)-count($a);});
//输出阵列
$pairs=array();
对于($i=0,$j=1;$i 虽然($j)你如何决定将元素9的值与元素10配对,而不是元素20或21?我只是举一个例子,但配对取决于1个键的1个元素和另一个键的第二个元素。不管你从20、21或10取它,这就是我坚持的地方:PSo得到11、21、12、22和13、23也是一个有效的结果?是的你说得对你救了我的半天助手(:@navedcheema别担心。很高兴我能帮上忙。当你看到@navedcheema时,这并没有给我正确的输出。你期望从中得到什么结果?12,25根据你之前的评论是有效的。它包含两对,但给我们12,25;另一对是22,23或22,24
function find_pairs($array) {
// re-index to 0
$array = array_values($array['parent_id']);
// sort so the longest arrays are first
usort($array, function ($a, $b) { return count($b) - count($a); });
// output array
$pairs = array();
for ($i = 0, $j = 1; $i < count($array) - 1; $i++) {
if (!count($array[$i])) continue;
while ($j <= $i || $j < count($array) && !count($array[$j])) $j++;
while (count($array[$i]) && isset($array[$j]) && count($array[$j])) {
$pairs[] = array(array_shift($array[$i]), array_shift($array[$j]));
// exhausted other arrays elements?
while ($j < count($array) && !count($array[$j])) $j++;
}
}
return $pairs;
}