Jump to content

can one use "foreach" when the number of arrays doubles each time through


Ailis

Recommended Posts

Greetings to all!

 

I am very new to this so I may not be on the right track.  I am providing some code I have because I think this is the best way to explain what I am trying to do.  I have a database and php pages that generate a pedigree when one selects any particular dog from the search page.  If anyway has a tip on how to simplify this, I would sure appreciate it!!

 

First, I request an array for the dog selected:

 

 

$sql = "SELECT RegName, SireID, DamID FROM pedigrees WHERE ID=";

$thisDogQ = $sql . $values["ID"];
$thisDogR = db_query($thisDogQ,$conn);


$thisDogRow_value = mysql_fetch_assoc($thisDogR);
    $thisDogRow_value = array (
'RegName' => $thisDogRow_value['RegName'],
'SireID' => $thisDogRow_value['SireID'],
'DamID' => $thisDogRow_value['DamID']);
</code>

//Next I request the same information for his sire

<code>
if (is_numeric($thisDogRow_value['SireID'])) {

$query_SireQ = $sql . $thisDogRow_value['SireID'];  
$SireR = mysql_query($query_SireQ, $conn) or die(mysql_error());

	$SireRow_value = mysql_fetch_assoc ($SireR);          
	$SireRow_value = array (
	'RegName' => $SireRow_value['RegName'],           
	'SireID' => $SireRow_value['SireID'],           
	'DamID' => $SireRow_value['DamID']);
</code>

//and then his dam

<code>
if (is_numeric($thisDogRow_value['DamID'])) {

$query_DamQ = $sql . $thisDogRow_value['DamID'];    
$DamR = mysql_query($query_DamQ, $conn) or die(mysql_error());

	$DamRow_value = mysql_fetch_assoc ($DamR);         
	$DamRow_value = array (
	'RegName' => $DamRow_value['RegName'],           
	'SireID' => $DamRow_value['SireID'],           
	'DamID' => $DamRow_value['DamID']);

</code>

Now, here's the rub:  Now I need the sire and the dam for those 2 [described above] so this time through, I will need the same information for FOUR dogs.  The next time will be for EIGHT, then SIXTEEN - and so on until there are a total of 256 dogs.

<code>
//Get PatGrandSire 2

	if (is_numeric($SireRow_value['SireID'])) {

	$PatGrandSireQ = $sql . $SireRow_value['SireID'];
	$PatGrandSireR = mysql_query ($PatGrandSireQ, $conn) or die(mysql_error());
   		$PatGrandSireRow_value = mysql_fetch_assoc ($PatGrandSireR);         

		$PatGrandSireRow_value = array (
		'RegName' => 	$PatGrandSireRow_value['RegName'],           
		'SireID' => 	$PatGrandSireRow_value['SireID'],           
		'DamID' => 		$PatGrandSireRow_value['DamID']);

//GetPatGrandDam 17
	if (is_numeric($SireRow_value['DamID'])) {
	$PatGrandDamQ = $sql . $SireRow_value['DamID'];
	$PatGrandDamR = mysql_query ($PatGrandDamQ, $conn) or die(mysql_error());
	$PatGrandDamRow_value = mysql_fetch_assoc ($PatGrandDamR);

	$PatGrandDamRow_value = array (
		'RegName' => 	$PatGrandDamRow_value['RegName'],
		'SireID' => 	$PatGrandDamRow_value['SireID'],
		'DamID' => 		$PatGrandDamRow_value['DamID']);
//Get Pat1GGrandSire-3

		if (is_numeric($PatGrandSireRow_value['SireID'])) {
		$Pat1GGrandSireQ = $sql . $PatGrandSireRow_value['SireID'];
		$Pat1GGrandSireR = mysql_query ($Pat1GGrandSireQ, $conn) or die(mysql_error());
      
		$Pat1GGrandSireRow_value = mysql_fetch_assoc ($Pat1GGrandSireR);         
			$Pat1GGrandSireRow_value = array (
			'RegName' => 	$Pat1GGrandSireRow_value['RegName'],           
			'SireID' => 	$Pat1GGrandSireRow_value['SireID'],
			'DamID' => 		$Pat1GGrandSireRow_value['DamID']);


		if (is_numeric($PatGrandSireRow_value['DamID'])) {
			$Pat1GGrandDamQ = $sql . $PatGrandSireRow_value['DamID'];
			$Pat1GGrandDamR = mysql_query ($Pat1GGrandDamQ, $conn) or die(mysql_error());
      
			$Pat1GGrandDamRow_value = mysql_fetch_assoc ($Pat1GGrandDamR);         
				$Pat1GGrandDamRow_value = array (
				'RegName' => 		$Pat1GGrandDamRow_value['RegName'],           
				'SireID' => 		$Pat1GGrandDamRow_value['SireID'],           
				'DamID' => 			$Pat1GGrandDamRow_value['DamID'],
				'Title' => 			$Pat1GGrandDamRow_value['Title'],
				'Title2' => 		$Pat1GGrandDamRow_value['Title2'],
				'Title3' => 		$Pat1GGrandDamRow_value['Title3'],
				'Title4' =>$Pat1GGrandDamRow_value['Title4'],
				'Title5' => $Pat1GGrandDamRow_value['Title5'],
				'Title6' =>$Pat1GGrandDamRow_value['Title6'],
				'Title7' => $Pat1GGrandDamRow_value['Title7'],
				'Title8' =>$Pat1GGrandDamRow_value['Title8'],
				'Title9' => $Pat1GGrandDamRow_value['Title9'],
				'Addl_Titles' => 	$Pat1GGrandDamRow_value['Addl_Titles']);
//Get Pat2GGrandSire-18

		if (is_numeric($PatGrandDamRow_value['SireID'])) {
		$Pat2GGrandSireQ = $sql . $PatGrandDamRow_value['SireID'];
		$Pat2GGrandSireR = mysql_query ($Pat2GGrandSireQ, $conn) or die(mysql_error());
      
		$Pat2GGrandSireRow_value = mysql_fetch_assoc ($Pat2GGrandSireR);         
			$Pat2GGrandSireRow_value = array (
			'RegName' => 		$Pat2GGrandSireRow_value['RegName'],           
			'SireID' => 		$Pat2GGrandSireRow_value['SireID'],
			'DamID' => 			$Pat2GGrandSireRow_value['DamID'],
			'Title' => 			$Pat2GGrandSireRow_value['Title'],
			'Title2' => 		$Pat2GGrandSireRow_value['Title2'],
			'Title3' => 		$Pat2GGrandSireRow_value['Title3'],
			'Title4' =>			$Pat2GGrandSireRow_value['Title4'],
			'Title5' => 		$Pat2GGrandSireRow_value['Title5'],
			'Title6' =>			$Pat2GGrandSireRow_value['Title6'],
			'Title7' => 		$Pat2GGrandSireRow_value['Title7'],
			'Title8' =>			$Pat2GGrandSireRow_value['Title8'],
			'Title9' => 		$Pat2GGrandSireRow_value['Title9'],

			'Addl_Titles' => 	$Pat2GGrandSireRow_value['Addl_Titles']);

	//Get Pat2GGrandDaminfo-25

	if (is_numeric($PatGrandDamRow_value['DamID'])) {
		$Pat2GGrandDamQ = $sql . $PatGrandDamRow_value['DamID'];
		$Pat2GGrandDamR = mysql_query ($Pat2GGrandDamQ, $conn) or die(mysql_error());
      
		$Pat2GGrandDamRow_value = mysql_fetch_assoc ($Pat2GGrandDamR);         
			$Pat2GGrandDamRow_value = array (
			'RegName' => 		$Pat2GGrandDamRow_value['RegName'],           
			'SireID' => 		$Pat2GGrandDamRow_value['SireID'],           
			'DamID' => 			$Pat2GGrandDamRow_value['DamID']);

Link to comment
Share on other sites

There's two approaches that come to mind here.  The first is recursion:

 

function getParents($DoggieID, $Depth, $DepthLimit) {
    $Sire = getSire($DoggieID);
    $Dam = getDam($DoggieID);
    $Depth++;
    if ($Depth == $DepthLimit) {
        return array($Sire, $Dam);
    } else {
        # Now get grandparents too
        $SireParents = getParents($Sire, $Depth, $DepthLimit);
        $DamParents = getParents($Dam, $Depth, $DepthLimit);
        return array($Sire, $Dam, $SireParents, $DamParents);
    }
}

 

That's the general idea - the data structure used to return everything might not be ideal.

 

The other idea is to use self joins:

 

SELECT RegName, SireID, DamID
, p2.RegName AS p2RegName, p2.SireID AS p2SireID, p2.DamID AS p2DamID, CASE WHEN p2.ID = p.SireID THEN 'Sire' ELSE 'Dam' END AS p2ParentType
, p3.RegName AS p3RegName, p3.SireID AS p3SireID, p3.DamID AS p3DamID, CASE WHEN p3.ID = p2.SireID THEN 'Sire' ELSE 'Dam' END AS p3ParentType
FROM pedigrees p
LEFT JOIN pedigrees p2 ON (p2.ID = p.SireID OR p2.ID = p.DamID)
LEFT JOIN pedigrees p3 ON (p3.ID = p2.SireID OR p3.ID = p2.DamID)
WHERE p.ID=123

 

And you can add p4, p5, p6 etc etc.

 

Neither of these approaches are ideal but they will get the job done.  What you really need for the output is a tree structure.

Link to comment
Share on other sites

OMG thank you SO much!  I've done a few searches on the 'tree' thing and see that you are right and that is what I should be using!  Sooooo, now I am going to figure out how to do that!!

 

You are the BEST!!

Link to comment
Share on other sites

Hi again, Matt!  I'm really embarrassed to admit this but I cannot figure out how to get the 'recurrsion' one to print out so I can see the result.

 

I have been researching the 'tree' to out put it but it would help me immensely if I could see the results on the page even if it is just a long list.  Actually for one of my pages, I will want simply a long list.

 

Would you mind providing me with the code so I can see the results?  Thanks so much!!!

Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.