tlive
tlive

Reputation: 1

Update an array with fields from matching array

I have Array1 that pulls all of the entries for a Wordpress custom post type, and I have Array2 from another table that shows if that post type has been seen by a specific user. If the ID of Array1 & the PageID of Array2 are the same, then add the [Started] & [Finished] fields from Array2 to Array1. Basically I want to combine them to form Array3. I have tried many different solutions with array_combine but can't get the result I'm looking for.

Array1 ( 
[0] => stdClass Object ( [ID] => 75 [post_title] => Test Training Video ) 
[1] => stdClass Object ( [ID] => 80 [post_title] => Test 2 )
[2] => stdClass Object ( [ID] => 85 [post_title] => Test 2 ) ) 

Array2 ( 
[0] => stdClass Object ( [PageID] => 75 [Started] => 1 [Finished] => 1 )
[0] => stdClass Object ( [PageID] => 80 [Started] => 1 [Finished] => 0 ) )

Array3 ( 
[0] => stdClass Object ( [ID] => 75 [post_title] => Test Training Video [Started] => 1 [Finished] => 1 ) 
[1] => stdClass Object ( [ID] => 80 [post_title] => Test 2 [Started] => 1 [Finished] => 0 )
[2] => stdClass Object ( [ID] => 85 [post_title] => Test 2 ) ) 

Upvotes: 0

Views: 52

Answers (4)

tlive
tlive

Reputation: 1

After trying the posted solutions I decided to make the change in my $wpdb->get_results sql statement instead of using 2 different sql statements and then combining the 2 different arrays. With help from this post - SQL query to join two tables despite the other table may not have values, I was able to use the following to get the desired result.

   $oneBigQuery = $wpdb->get_results("SELECT a.ID, a.post_title, b.PageID, b.Started, b.Finished
FROM $wpdb->posts AS a
LEFT JOIN exampleTableName AS b
    ON a.ID = b.PageID
    AND b.UserID = 3
WHERE a.post_type = 'custom-post-type'
    ");

Upvotes: 0

Flunch
Flunch

Reputation: 826

You could try a first loop to make your array "ID" match and then combine both arrays

foreach( $array2 as $key=>$value )
   {
      $value['ID'] = $value['PageId'];
      unset($value['PageId']);
      $array2[$key] = $value;
   }

$array3 = array_merge_recursive($array1,$array2);

Upvotes: 0

vdwijngaert
vdwijngaert

Reputation: 1555

array_combine() is not the right function for this.

In your case, you need to use a foreach-loop to loop over the values of your first array and compare them with your second array.

You also need to rearrange array 2, so that you can easily access the values for started and finished using the pageID as key:

$pageMap = array();
foreach($array2 as $entry) {
    $pageMap[$entry['PageID']] = array('started' => $entry['Started'], 'finished' => $entry['Finished']);
}

Then you can do:

$combined_array = array();
foreach($array1 as $post) {
    if(!isset($pageMap[$post['ID']])) continue; // do nothing if there are no started/finished entries.
    $combined_array[$post['ID']] = array_merge($post, $pageMap[$post['ID']]);
}

Upvotes: 0

Izzy
Izzy

Reputation: 412

Something like this?

$array3 = array();
foreach( $array1 as $arr1 )
{
   foreach( $array2 as $arr2 )
   {
      if( $arr1["ID"] == $arr2["PageID"] )
      {
         $array3[] = array( $arr1["Started"], $arr2["Finished"] );
      } 
   }
}

Upvotes: 1

Related Questions