RE: [PHP] What search algorithm does in_array() use?
| From: | Ken Dozier | Date: | Tue, 30 Jan 2007 20:30:33 +0000 |
| Subject: | RE: [PHP] What search algorithm does in_array() use? | ||
| References: | 1 2 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-248050@lists.php.net to get a copy of this message | ||
Thanks to all for your input, guys.
Regarding the construction of the SQL query, I would love to try it with
SUBSELECTs; but, alas, we are using RHEL 3 which ships with MySQL 3.23. I
don't think RH supports any 4.0 or later versions of MySQL on RHEL 3, so I'm
stuck with 3.23 for the time being. I had tried a query like this:
SELECT d.account FROM data AS d, accesslist AS a WHERE d.account=a.account
AND a.username='username'
but it also took quite a bit of time. Since the problem would appear for
only a few users, I may have to simply hard code a workaround for the time
being and then come back to it later.
Thanks again for all of your help.
Ken.
-----Original Message-----
From: Richard Lynch [mailto:ceo@l-i-e.com]
Sent: Monday, January 29, 2007 6:13 PM
To: Ken Dozier
Cc: php-general@lists.php.net
Subject: Re: [PHP] What search algorithm does in_array() use?
On Mon, January 29, 2007 11:20 am, Ken Dozier wrote:
> Does in_array() use a search algorithm (i.e., binary search), or does
> it check sequentially each element in the array?
Since there is no guarantee that the elements are in any particular order,
it almost has to be sequential...
> I am using in_array() within a while{} loop to check query results
> against an access-list array to produce a third array containing items
> that successfully passed the comparison test. Because the two
> starting arrays in the worst-case scenario can have 8,000 items each,
> the loop is timing out.
> Advice or alternative methods are appreciated.
>
> Code Sample:
> <?php
> function check_results($results, $access_list) { # Check for $results
> in array $access_list and
> # add matches to array $match.
>
> $result = false;
> $match = array();
>
> while ($r = mysql_fetch_row($results))
> { if ( in_array($r[0], $access_list) )
> { $match[] = $r; }
> }
>
> if ( count($match) > 0 ) { $result = $match; }
>
> return $result;
> }
> ?>
Ideal #1:
Figure out how to write an SQL query to find what's in the DB, and don't do
any search in PHP at all.
Ideal #2:
Put the values in as keys, and use http://php.net/isset This will
"hash" the
values and have an O(1) lookup, I think.
Only works if you know the uniqueness of the values to be searched, or don't
care about duplicates.
--
Some people have a "gift" link here.
Know what I want?
I want you to buy a CD from some starving artist.
http://cdbaby.com/browse/from/lynch
Yeah, I get a buck. So?