Php 基于键从动态关联数组生成二进制配对数组,每个键一个元素

Php 基于键从动态关联数组生成二进制配对数组,每个键一个元素,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,我基本上是从一个动态关联数组中创建Pair,这样我从一个键数组中取一个元素,从另一个键数组中取另一个元素,这两个元素在这个键数组上组合,形成Pair 1。问题是,这是一个动态关联数组,它可以有4个键,每个键的数组中可以有最大两个元素,最小一个元素,为了配对,我们应该有两个键,在这两个键数组的两侧各有一个元素。 比如说 [parent_id] => Array ( [9] => Array

我基本上是从一个动态关联数组中创建Pair,这样我从一个键数组中取一个元素,从另一个键数组中取另一个元素,这两个元素在这个键数组上组合,形成Pair 1。问题是,这是一个动态关联数组,它可以有4个键,每个键的数组中可以有最大两个元素,最小一个元素,为了配对,我们应该有两个键,在这两个键数组的两侧各有一个元素。 比如说

    [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;
}