1

When querying the database using wpdb class in WordPress I often get a numerical array of objects:

array(
    [0] => stdClass(
        comment_ID = 3
        comment_post_ID = 19
        user_id = 7
    )
    [1] => stdClass(
        comment_ID = 5
        comment_post_ID = 19
        user_id = 6
    )
)

I require to perform a second query using the user_id. To retrieve the user_id I use a foreach loop like:

$user_ids = array();

foreach($array as $object) {
    $user_ids[] = $object->user_id;
}

I want to know whether there is a PHP native better way of retrieving the user_id and avoid the foreach altogether?

7
  • You could try using a different query in the first instance. But as you have nto given us that query, we can't be sure Commented Jul 29, 2013 at 10:38
  • php.net/array_map Commented Jul 29, 2013 at 10:38
  • Bind in to the DB results using a while loop? Without seeing how you're using the DB class, it's difficult to provide an accurate answer really. Commented Jul 29, 2013 at 10:39
  • 2
    There's nothing wrong with that loop... It's probably the fastest and most elegant way you can do this in PHP. Commented Jul 29, 2013 at 10:40
  • 1
    You should consider using something like INNER JOIN to form query that would return list with required data so you wouldn't need to send multiple queries to the database which will be faster as well as less loops are needed. Commented Jul 29, 2013 at 10:47

1 Answer 1

4

You may try to use array_map instead of foreach:

$user_ids = array_map(function($obj){ return $obj->user_id; }, $array);

NOTE: This example requires at least PHP 5.3, as it was implemented with anonymous functions.


As the benchmark shows, native foreach-loop is faster than array_map. It is more efficient, as it is a native language construction. If ignore this fact, other cycle constructions (while, for) or array_map are the only way.


But it would be really better, if you reconstruct your query, to execute it without php-processing. There are a lot of functionality like INNER JOIN, LEFT JOIN, subqueries, loops and stored procedures. It might be really faster.

Sign up to request clarification or add additional context in comments.

5 Comments

there should be noted that to use anonymous functions atleast PHP 5.3 is required
This was a solution I thought of but I'm sure this is going to be slower than foreach due to added overhead of a function call. And BTW, array_map also does a loop. I'm looking for a "better (read faster) native option".
@CORRUPT Saw your update. Please see my comment on the question above.
@John yes, foreach is faster. It is a fastest way. And you asking to avoid it.
@CORRUPT :) Yeah, I was essentially looking for a language construct than a function that could yield a better performance. Something that may have been introduced in later version of PHP and that I do not know of. I guess there are none. May be you want to update your answer with a note on performance, I'll select it as the answer since there are no alternatives.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.