Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

sorting in PHP.

0 views
Skip to first unread message

amit

unread,
Mar 26, 2008, 4:00:51 PM3/26/08
to

Hello group,

I'm getting data string as following. One of the columns is unixtime
(10th element in each row) . How can I sort my array base on that?

"310","true","6824567491","682087491","714469","xxxxx","xxxxx","xxxxx","xxxx","xxxxx","1206047432"
"310","false","681224591","682087491","667256827","yyyyy","yyyy","yyyy","yyyy","yyyy","1206047837"

Thanks.

Michael Fesser

unread,
Mar 26, 2008, 5:04:28 PM3/26/08
to
.oO(amit)

Write your own sorting function to use with usort().

Micha

Alexey Kulentsov

unread,
Mar 26, 2008, 5:17:46 PM3/26/08
to

bad way but illustrates usort()
--------------------------------
define('TS_REGEXP','/^(?:"[^"]*",){10}"(\d+)"$/');

// data
$d=array
('"310","true","6824567491","682087491","714469","xxxxx","xxxxx","xxxxx","xxxx","xxxxx","1206047432"'
,'"310","false","681224591","682087491","667256827","yyyyy","yyyy","yyyy","yyyy","yyyy","1206047837"'
);

// Extract and compare timestamps from two rows
function rowCompare($a,$b)
{
preg_match(TS_REGEXP,$a,$ar);preg_match(TS_REGEXP,$b,$br);
return (int)$ar[1] > (int)$br[1];
}

// sort array
usort($d,'rowCompare');
// sorted array in $d
--------------------------------


good way but it is depends where you will to use results.
--------------------------------
define('TS_REGEXP','/^(?:"[^"]*",){10}"(\d+)"$/');

// data
$d=array
('"310","true","6824567491","682087491","714469","xxxxx","xxxxx","xxxxx","xxxx","xxxxx","1206047432"'
,'"310","false","681224591","682087491","667256827","yyyyy","yyyy","yyyy","yyyy","yyyy","1206047837"'
);

// additional array
$d1=array();

// make index
foreach($d as $data)
{
preg_match(TS_REGEXP,$data,$key);
$d1[(int)$key[1]]=$data;
}
ksort($d1);
// sorted array in $d1
--------------------------------

one more index, no data copy in it:
--------------------------------
...
$ts_index=array();
foreach($d as $index=>$data)
{
preg_match($r,$data,$key);
$ts_index[(int)$key[1]]=$index;
}

ksort($ts_index);
$ts_index=array_values($ts_index);

// loop ordered by timestamp
foreach($ts_index as $index)
echo $d[$index]."\n";

--------------------------------

?>

amit

unread,
Mar 26, 2008, 5:59:52 PM3/26/08
to
On Mar 26, 2:04 pm, Michael Fesser <neti...@gmx.de> wrote:
> .oO(amit)
>
> >I'm getting data string as following. One of the columns is unixtime
> >(10th element in each row) . How can I sort my array base on that?
>
> >"310","true","6824567491","682087491","714469","xxxxx","xxxxx","xxxxx","xx­xx","xxxxx","1206047432"
> >"310","false","681224591","682087491","667256827","yyyyy","yyyy","yyyy","y­yyy","yyyy","1206047837"

>
> Write your own sorting function to use with usort().
>
> Micha


Hi Micha,

I did and for some reasons (I'm trying to undersetand why) I get this:
(sort base on the last value which is unitime). It is not sorted in
fact only the places are changed.


Before sort:
Array
(
[0] => 31042035360,send,
629956827,629956827,682087491,xxxx,xxx,xxxx,xxxx,xxxx, 1206043792
[1] => 31042035360,send,
629956827,629956827,682087491,www,wwww,wwww,wwwww,wwwww, 1206045678
[2] => 31042035360,send,
629956827,629956827,1070753141,ddddd,ddddd,ddddd,ddd,dddd, 1206044017
)

After sort:
Array
(

[0] => 31042035360,send,
629956827,629956827,1070753141,ddd,dddd,ddddd,ddddd,dddd, 1206044017
[1] => 31042035360,send,
629956827,629956827,682087491,wwww,wwwww,wwwwww,wwww,wwww,1206045678
[2] => 31042035360,send,
629956827,629956827,682087491,xxx,xxx,xxxx,xxxx,xxxx, 1206043792
)

Thanks.

amit

unread,
Mar 26, 2008, 6:01:32 PM3/26/08
to
On Mar 26, 2:17 pm, Alexey Kulentsov <a...@inbox.ru> wrote:
> amit wrote:
> > I'm getting data string as following. One of the columns is unixtime
> > (10th element in each row) . How can I sort my array base on that?
>
> > "310","true","6824567491","682087491","714469","xxxxx","xxxxx","xxxxx","xxx­x","xxxxx","1206047432"
> > "310","false","681224591","682087491","667256827","yyyyy","yyyy","yyyy","yy­yy","yyyy","1206047837"

>
> bad way but illustrates usort()
> --------------------------------
> define('TS_REGEXP','/^(?:"[^"]*",){10}"(\d+)"$/');
>
> // data
> $d=array
> ('"310","true","6824567491","682087491","714469","xxxxx","xxxxx","xxxxx","x­xxx","xxxxx","1206047432"'

> ,'"310","false","681224591","682087491","667256827","yyyyy","yyyy","yyyy","­yyyy","yyyy","1206047837"'
> );
>
> // Extract and compare timestamps from two rows
> function rowCompare($a,$b)
> {
>         preg_match(TS_REGEXP,$a,$ar);preg_match(TS_REGEXP,$b,$br);
>         return (int)$ar[1] > (int)$br[1];
>
> }
>
> // sort array
> usort($d,'rowCompare');
> // sorted array in $d
> --------------------------------
>
> good way but it is depends where you will to use results.
> --------------------------------
> define('TS_REGEXP','/^(?:"[^"]*",){10}"(\d+)"$/');
>
> // data
> $d=array
> ('"310","true","6824567491","682087491","714469","xxxxx","xxxxx","xxxxx","x­xxx","xxxxx","1206047432"'


Thanks indeed for you solution using regular experession but I'm
afraid to get into trouble later since I'm not familiar with RE yet.

Any other suggestions?

Regards.

Alexey Kulentsov

unread,
Mar 26, 2008, 6:13:53 PM3/26/08
to
amit wrote:
> Thanks indeed for you solution using regular experession but I'm
> afraid to get into trouble later since I'm not familiar with RE yet.
>
> Any other suggestions?
I highly recommend to learn regular expressions because this is very
useful tool for parsing any complex string data. And don't afraid to use
it - in the case of problems here is enough peoples in the world to help
you.

amit

unread,
Mar 26, 2008, 6:51:03 PM3/26/08
to


Ok then I'll go for it. I'll keep you posted.

Thanks!

Michael Fesser

unread,
Mar 26, 2008, 7:58:34 PM3/26/08
to
.oO(amit)

>Thanks indeed for you solution using regular experession but I'm
>afraid to get into trouble later since I'm not familiar with RE yet.
>
>Any other suggestions?

Here's another one:

The strings look like CSV, so you could try to split them. Currently PHP
can only read CSV data from files, but in coming PHP versions there will
be a function to parse CSV strings. For now you could use this hackish
replacement until the official str_getcsv() becomes available:

if (!function_exists('str_getcsv')) {
function str_getcsv($input, $delimiter = ',', $enclosure = '"',
$escape = '\\') {
$fh = fopen('php://memory', 'w+');
fwrite($fh, $input);
rewind($fh);
$result = fgetcsv($fh, 0, $delimiter, $enclosure);
fclose($fh);
return $result;
}
}

With this function you can easily split your data strings and should be
able to use usort() to sort them on the 10th item.

HTH
Micha

Robin

unread,
Mar 27, 2008, 5:52:11 AM3/27/08
to
amit wrote:
> On Mar 26, 2:04 pm, Michael Fesser <neti...@gmx.de> wrote:
>> .oO(amit)
>>
>>> I'm getting data string as following. One of the columns is unixtime
>>> (10th element in each row) . How can I sort my array base on that?
>>> "310","true","6824567491","682087491","714469","xxxxx","xxxxx","xxxxx","xx軍x","xxxxx","1206047432"
>>> "310","false","681224591","682087491","667256827","yyyyy","yyyy","yyyy","y軌yy","yyyy","1206047837"

I'ld convert that array in to two dimensions first:

<?php
echo "Before convert:\n";
print_r($a);

$b = array();
foreach ($a as $r) {
$b[]=explode(',',$r);
}

echo "After convert:\n";
print_r($b);
?>

Then you can use usort as follows:

<?php
echo "Before Sort:\n";
print_r($b);

function datecmp($a,$b) {
return ($a[10]==$b[10]?0:($a[10]<$b[10]?-1:1));
}

usort($b,datecmp);

echo "After Sort:\n";
print_r($b);
?>

Regards
Robin

amit

unread,
Mar 27, 2008, 5:37:40 PM3/27/08
to
On Mar 27, 2:52 am, Robin <a...@somewhere.com> wrote:
> amit wrote:
> > On Mar 26, 2:04 pm, Michael Fesser <neti...@gmx.de> wrote:
> >> .oO(amit)
>
> >>> I'm getting data string as following. One of the columns is unixtime
> >>> (10th element in each row) . How can I sort my array base on that?
> >>> "310","true","6824567491","682087491","714469","xxxxx","xxxxx","xxxxx","xx­­xx","xxxxx","1206047432"
> >>> "310","false","681224591","682087491","667256827","yyyyy","yyyy","yyyy","y­­yyy","yyyy","1206047837"
> Robin- Hide quoted text -
>
> - Show quoted text -

Hi all,

I did post a reply here but since I was not logged in so google made
me to login back. I made a mistake and clicked on "New Post" and this
caused to createa new thread. I apologize all for this mistake.

link is: http://groups.google.com/group/comp.lang.php/browse_thread/thread/f559cf0ad1a2b771/0902a550fd75384c?hl=en#0902a550fd75384c

I was wondering if we could continue it here to avoid any confusion
for future readers.


Regards.

0 new messages