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.
Write your own sorting function to use with usort().
Micha
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";
--------------------------------
?>
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.
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.
Ok then I'll go for it. I'll keep you posted.
Thanks!
>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
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
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.
I was wondering if we could continue it here to avoid any confusion
for future readers.
Regards.