3v4l.org

run code in 300+ PHP versions simultaneously
<?php function buildPedigree($haystack, $akc_reg_num, $generation = 0) { ++$generation; foreach ($haystack as $index => $row) { if ($row['akc_reg_num'] == $akc_reg_num) { $result = ['sire' => $row['akc_parent_sire'], 'dam' => $row['akc_parent_dam']]; unset($haystack[$index]); // reduce the haystack to improve efficiency and avoid infinite loop break; } } if (!isset($result)) { return []; // $akc_reg_num not found } foreach ($haystack as $row) { if ($row['akc_reg_num'] == $result['sire']) { $result['sire_parents'] = array_filter(buildPedigree($haystack, $row['akc_reg_num'], $generation)); // recurse and purge empty parent arrays if (array_key_exists('dam_parents', $result)) { break; // both parents found in generation, stop this loop } } elseif ($row['akc_reg_num'] == $result['dam']) { $result['dam_parents'] = array_filter(buildPedigree($haystack, $row['akc_reg_num'], $generation)); // recurse and purge empty parent arrays if (array_key_exists('sire_parents', $result)) { break; // both parents found in generation, stop this loop } } } return $generation <= 4 ? $result : []; } $animals = [ ['id' => 1, 'akc_reg_num' => 1, 'akc_parent_sire' => 2, 'akc_parent_dam' => 3], ['id' => 2, 'akc_reg_num' => 2, 'akc_parent_sire' => 5, 'akc_parent_dam' => 6], ['id' => 3, 'akc_reg_num' => 3, 'akc_parent_sire' => 9, 'akc_parent_dam' => 0], ['id' => 4, 'akc_reg_num' => 5, 'akc_parent_sire' => 0, 'akc_parent_dam' => 0], ['id' => 5, 'akc_reg_num' => 6, 'akc_parent_sire' => 7, 'akc_parent_dam' => 8], ['id' => 6, 'akc_reg_num' => 7, 'akc_parent_sire' => 0, 'akc_parent_dam' => 0], ['id' => 7, 'akc_reg_num' => 8, 'akc_parent_sire' => 0, 'akc_parent_dam' => 0], ['id' => 8, 'akc_reg_num' => 9, 'akc_parent_sire' => 10, 'akc_parent_dam' => 11], ['id' => 9, 'akc_reg_num' => 10, 'akc_parent_sire' => 0, 'akc_parent_dam' => 0], ['id' => 10, 'akc_reg_num' => 11, 'akc_parent_sire' => 12, 'akc_parent_dam' => 0], ['id' => 11, 'akc_reg_num' => 12, 'akc_parent_sire' => 0, 'akc_parent_dam' => 0] ]; var_export(buildPedigree($animals, 1));

preferences:
27.11 ms | 405 KiB | 5 Q