Page 1 of 1

Array Searching

Posted: Tue Jun 29, 2010 1:54 pm
by tomnoble
Hi all,

I have the following code:

Code: Select all

function term_insert($String1, $String2)
  {
    $countries = explode("|", $String1);
    $subs = explode("|", $String2);
    $treference = mysql_query("SELECT * FROM drupal_term_node");
    for each ($countries as $value)
      {
        <Find $value in the $treference array and lookup the assigned tid value>
        //Insert data into the Drupal_term_node table
        mysql_query("INSERT INTO drupal_term_node
        VALUES ($NID_Value, $VID_Value, $TID_Value)");
          for each ($subs as $value1)
            {
              $value1 == $value.$value1 //concatinate the two values
              <Find $value1 in the $treference array and lookup the assigned tid value> 
              //Insert data into the Drupal_term_node table
              mysql_query("INSERT INTO drupal_term_node
              VALUES ($NID_Value, $VID_Value, $TID_Value)");
            }
       }
  }
What is is doing is reading in all the values from a mysql table, placing them in an array and then taking a string apart and finding the values in the table.

The part I am having trouble with is this:

I have a value, I want to find that value in the array I have made.

So I want to search the array $treference for $value, and when it is found, return the row it is on.
If it is not found, then skip the loop and move onto the next value.

Any ideas if I can do this?

Kind Regards

Tom

Re: Array Searching

Posted: Tue Jun 29, 2010 2:31 pm
by AbraCadaver
First, $treference is not an array, its a mysql result resource. Do something like this:

Code: Select all

$treference = mysql_query("SELECT * FROM drupal_term_node");

while($row = mysql_fetch_assoc($treference)) {
   if(in_array($row['some_field'], $countries)) {  //some_field is whatever field you are looking for the county in
      $TID_Value = $row['tid'];
      //do stuff
   }
}

Re: Array Searching

Posted: Tue Jun 29, 2010 3:00 pm
by tomnoble
Hi AbraCadaver, thanks for the reply.

Could I post the first sentence at the top of my module and then use the rest within a function? As I don't want to make unnecessary database calls.

The code is being used to complete mass uploads for a products database, so if I am having 350 consecutive calls to the DB it is going to become very innefficient.

Thanks for your help so far, very useful.

Kind Regards

Tom

Re: Array Searching

Posted: Tue Jun 29, 2010 3:12 pm
by AbraCadaver
If I understand correctly, you might be better off building the array from the database first and then passing that to function(s):

Code: Select all

$treference = mysql_query("SELECT * FROM drupal_term_node");

while($row = mysql_fetch_assoc($treference)) {
   $db_rows[] = $row;
}

Re: Array Searching

Posted: Thu Jul 01, 2010 1:35 pm
by tomnoble
I wonder if you could tell me what I am doing wrong here:

Code: Select all

  {
   $Counter1 = 1
   $Counter = 1;
   $file_handle = fopen("product_database.csv", "r");

    while (!feof($file_handle) ) 
      {
        $product_information = fgetcsv($file_handle, 2048);
        $Counter += 1;    
      }
      fclose($file_handle);     
      For (Counter1 <= Counter)
        {
          node_insert($product_information[$Counter1, 2]);
          content_type_insert();
          url_insert('Node/'$NID, 'Catalog/'$product_information[$Counter1, 2]);
Apparently, there is something wrong with my For (Counter...) and Something wrong with the way I am referencing the array. node_insert is a function waiting to be passed the value, which will be stored in the array in row = Counter1, column 2.

Any ideas?

Kind Regards

Tom

Re: Array Searching

Posted: Thu Jul 01, 2010 1:42 pm
by AbraCadaver
There's a lot of problems with that code, but it's not complete. Is there something missing at the end? A counter increment, a closing } ? Paste more and I'll check it out.

1. you fclose() and then try and use the file handle again
2. For (Counter1 <= Counter) //this is not a valid for and those aren't variables (where's the $)
3. Multidimensional arrays aren't referenced like $var[1, 2], they are referenced like $var[1][2]
4. I don't think you have a multidimensional array
5. Your loops are not nested so you will only have the last $product_information that was retrieved
6. There's really no reason to use counters here.

Re: Array Searching

Posted: Thu Jul 01, 2010 1:46 pm
by tomnoble
Thanks for the quick reply.

Sorry for the reduced code, here is the function in its entirety:

Code: Select all

function csv_access()
  {
   $Counter1 = 1;
   $Counter = 1;
   $file_handle = fopen("ProductDatabase.csv", "r");

    while (!feof($file_handle) ) 
      {
        $product_information = fgetcsv($file_handle, 2048);
        $Counter += 1;    
      }
      fclose($file_handle);     
      For ($Counter <= $Counter)
        {
          $toinsert = $product_information[2];
		  node_insert($toinsert);
          content_type_insert();
          url_insert('Node/'. $NID, 'Catalog/'.$product_information[2, $Counter1]);
          products_insert('00000'Counter1, create_hash($Counter1, $product_information[$Counter1, 2]));
          term_insert($product_information[$Counter1, 0], $product_information[$Counter1, 1]);
          multigeog_insert($product_information[$Counter1, 4], $product_information[$Counter1, 5], $product_information[$Counter1, 6], $product_information[$Counter1, 7], $product_information[$Counter1, 8]);
          comment_insert();
          access_insert();
          revisions_insert($product_information[$Counter1, 2], $product_information[$Counter1, 3], $product_information[$Counter1, 3]);
          history_insert();
          files_insert($product_information[$Counter1, 9]);
          content_type_insert();
          image_cache_insert();
          echo 'Test';
        }
  }
I have changed the counters to proper variables as you suggested.

Kind Regards

Tom

Re: Array Searching

Posted: Thu Jul 01, 2010 1:58 pm
by AbraCadaver
It's difficult for me to decipher your code, but this is my best guess:

Code: Select all

error_reporting(E_ALL);
ini_set('display_errors', '1');

function csv_access() {
	$file_handle = fopen("product_database.csv", "r");
	
	$Counter = 1;
	
	while (!feof($file_handle)) {
		$product_information = fgetcsv($file_handle);
		
		node_insert($product_information[2]);
		content_type_insert();
		url_insert('Node/'.$NID, 'Catalog/'.$product_information[2]);
		products_insert('00000'.$Counter, create_hash($Counter, $product_information[2]));
		term_insert($product_information[0], $product_information[1]);
		multigeog_insert($product_information[4], $product_information[5], $product_information[6], $product_information[7], $product_information[8]);
		comment_insert();
		access_insert();
		revisions_insert($product_information[2], $product_information[3], $product_information[3]);
		history_insert();
		files_insert($product_information[9]);
		content_type_insert();
		image_cache_insert();
		
		$Counter++;
	}
}

Re: Array Searching

Posted: Thu Jul 01, 2010 3:54 pm
by tomnoble
I must admit my coding is pretty bad.

I am testing the code you supplied now, and it does this:

Code: Select all

function csvaccess() {
        global $NID_Value, $Product_Title;
        
        $file_handle = fopen("product_database.csv", "r");
        
        $Counter = 1;
        
        while (!feof($file_handle)) {
                $product_information = fgetcsv($file_handle);
                node_insert();
But doesn't ever move on from the node_insert function. Which looks like this:

Code: Select all

function node_insert()
  {
    global $Timestamp,$NID_Value, $NID_Value, $Product_Title;
    //Insert data into the Drupal_node table
    mysql_query("INSERT INTO drupal_node (type,title,uid,status,created,changed,comment,promote,moderate,sticky,tnid,translate)
    VALUES ('product', $Product_Title, '1', '1', $Timestamp, $Timestamp, '0', '0', '0', '0', '0', '0')");
    $NID_Value = mysql_insert_id();
    $VID_Value = $NID_Value;
    mysql_query("UPDATE drupal_node SET vid = $NID_Value WHERE nid = '$NID_Value'");
  }
For some reason, the "title" field in that table which has a type of varchar(255), wont accept a string in the variable $Product_Title. The first value of $Product_Title = "Product 1"

Any ideas on this? I have been trying to work this out for over an hour now.

Kind Regards

Tom

Re: Array Searching

Posted: Thu Jul 01, 2010 4:21 pm
by AbraCadaver
For one, you need to quote text values in the query (look at $Product_Title):
[text]VALUES ('product', '$Product_Title', '1', '1', $Timestamp, $Timestamp, '0', '0', '0', '0', '0', '0')");[/text]

Re: Array Searching

Posted: Thu Jul 01, 2010 4:31 pm
by tomnoble
Thankyou very much. Full complement of working code :D