<?php
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;
}
$array = array ('parent_id' => array([1]));
print_r(find_pairs($array));
$array = array ('parent_id' => array([1], [3]));
print_r(find_pairs($array));
$array = array ('parent_id' => array([1], [3], [5]));
print_r(find_pairs($array));
$array = array ('parent_id' => array([1], [3], [5], [7]));
print_r(find_pairs($array));
$array = array ('parent_id' => array([1, 2]));
print_r(find_pairs($array));
$array = array ('parent_id' => array([1, 2], [3]));
print_r(find_pairs($array));
$array = array ('parent_id' => array([1, 2], [3], [5]));
print_r(find_pairs($array));
$array = array ('parent_id' => array([1, 2], [3], [5], [7]));
print_r(find_pairs($array));
$array = array ('parent_id' => array([1, 2], [3, 4]));
print_r(find_pairs($array));
$array = array ('parent_id' => array([1, 2], [3, 4], [5]));
print_r(find_pairs($array));
$array = array ('parent_id' => array([1, 2], [3, 4], [5], [7]));
print_r(find_pairs($array));
$array = array ('parent_id' => array([1, 2], [3, 4], [5, 6]));
print_r(find_pairs($array));
$array = array ('parent_id' => array([1, 2], [3, 4], [5, 6], [7]));
print_r(find_pairs($array));
$array = array ('parent_id' => array([1, 2], [3, 4], [5, 6], [7, 8]));
print_r(find_pairs($array));
preferences:
25.64 ms | 408 KiB | 5 Q