You are here: Re: Need help with sorting array « PHP Programming Language « IT news, forums, messages
Re: Need help with sorting array

Posted by My Pet Programmer on 12/23/07 23:26

Big Moxy said:
> On Dec 23, 2:18 pm, My Pet Programmer <anth...@mypetprogrammer.com>
> wrote:
>> Big Moxy said:
>>
>>
>>
>>
>>
>>> On Dec 23, 1:09 pm, My Pet Programmer <anth...@mypetprogrammer.com>
>>> wrote:
>>>> Big Moxy said:
>>>>> On Dec 23, 11:17 am, My Pet Programmer <anth...@mypetprogrammer.com>
>>>>> wrote:
>>>>>> Big Moxy said:
>>>>>>> I have a routine to extract the name and mtime files in a directory.
>>>>>>> PHP by default sorts the array key. I looked at other sort functions
>>>>>>> but don't understand how to sort on a different field.
>>>>>>> Can someone please show me how to sort by the filemtime field instead
>>>>>>> of the filename?
>>>>>>> Thank you!
>>>>>>> Tim
>>>>>>> <TABLE ALIGN=CENTER BGCOLOR=#ffffff CELLPADDING=4 CELLSPACING=0
>>>>>>> border=2>
>>>>>>> <tr><TH>File</TH><TH>Date</TH></TR>
>>>>>>> <?php
>>>>>>> $dir="./";
>>>>>>> if (is_dir($dir)) {
>>>>>>> $dh = @opendir($dir);
>>>>>>> if($dh) {
>>>>>>> while (($file = @readdir($dh)) == true) {
>>>>>>> $pos = strpos($file, '.');
>>>>>>> if (!$pos === false) {
>>>>>>> if ($file != "." && $file != "..") {
>>>>>>> $file_array[] = $file;
>>>>>>> }
>>>>>>> }
>>>>>>> }
>>>>>>> }
>>>>>>> sort($file_array);
>>>>>>> reset($file_array);
>>>>>>> for($i=0;$i<count($file_array);$i++) {
>>>>>>> $name=$file_array[$i];
>>>>>>> $date = date("Y-m-d H:i", filemtime($name));
>>>>>>> if (!is_dir($name)) {
>>>>>>> print("<tr><TD>$name</TD><TD>$date</TD></TR>\n");
>>>>>>> }
>>>>>>> }
>>>>>>> }
>>>>>>> ?>
>>>>>>> </TABLE>
>>>>>> http://www.php.net/manual/en/function.asort.php
>>>>>> RTM
>>>>>> ~A!- Hide quoted text -
>>>>>> - Show quoted text -
>>>>> The manual may be easy for you to understand but for me the
>>>>> documentation and subsequent discussion is anything but intuitive. It
>>>>> also doesn't help that all of the code samples are not commented.
>>>>> Is there someone who can respond with the understanding that I may not
>>>>> be an expert PHP programmer?
>>>> My apologies. You are correct in that I assumed you were much more into
>>>> PHP than you are. Comes from spending too much time in the code, I
>>>> think. Ok, so here you go, then:
>>>> When you run asort on an array, it sorts the array by value, instead of
>>>> by key. Since you have an array of filenames you want sorted ascending
>>>> (A-Z), you can run this line of code to sort then appropriately:
>>>> asort($file_array);
>>>> And you don't need to reset the array, your loop looks at them in order,
>>>> so you don't need to worry about the internal array pointer.
>>>> Sorry for the mix up.
>>>> ~A!- Hide quoted text -
>>>> - Show quoted text -
>>> Thank you. I have enough general coding experience to understand a lot
>>> of code however I was lost without any comments in the manual
>>> examples. My original code contained sort($file_array) which yielded
>>> ascending results by file name. I want to sort by filemtime (date/time
>>> last modified). It seems to me that I have to create a new array and
>>> load name and filemtime a two-dimensional array. Is that correct?
>>> That leads me to a new question. How do I create and load the new
>>> array? I tried this:
>>> // do I explicitly define the new $file_results array? if so,
>>> how?
>>> //
>>> for($i=0;$i<count($file_array);$i++) {
>>> $name=$file_array[$i];
>>> $date = date("Y-m-d H:i", filemtime($name));
>>> if (!is_dir($name)) {
>>> $file_results[$i]['date'] = $date;
>>> $file_results[$i]['name'] = $name;
>>> }
>>> }
>>> which produces:
>>> Date File
>>> Array['date'] Array['name']
>>> Array['date'] Array['name']
>>> Array['date'] Array['name']
>>> Array['date'] Array['name']
>>> Array['date'] Array['name']
>>> Thanks,
>>> Tim
>> I thought you would be keying on the name and sorting by date, so I was
>> thinking you could:
>>
>> for(....) {
>> $file_array[$name] = $date;
>>
>> }
>>
>> asort($file_array);
>>
>> foreach ($file_array as $name=>$date) {
>> print $name." -- ".$date;
>>
>> }
>>
>> ~A!- Hide quoted text -
>>
>> - Show quoted text -
>
> We're almost there!! url - http://projects.missioninternet.com/proweb/clients/dirlist.php
>
> I used arsort and you can see the file dates are sorted in descending
> order. My question is how do I get rid of the other array elements?
>
> for($i=0;$i<count($file_array);$i++) {
> $name=$file_array[$i];
> $date = date("Y-m-d H:i", filemtime($name));
> if (!is_dir($name)) {
> $file_array[$name] = $date;
> }
> }
> arsort($file_array);
> foreach ($file_array as $name=>$date) {
> print("<tr><TD>".$date."</TD><TD>".$name."</TD></TR>\n");
> }

Oh, sorry, I should have used a different variable name for the output
array.

$outArray = array();
for($i=0;$i<count($file_array);$i++) {
$name=$file_array[$i];
$date = date("Y-m-d H:i", filemtime($name));
if (!is_dir($name)) {
$outArray[$name] = $date;
}
}

arsort($out_array);

foreach ($outArray as $name=>$date) {
print("<tr><TD>".$date."</TD><TD>".$name."</TD></TR>\n");
}

Then You should be all set.

~A!

 

Navigation:

[Reply to this message]


Удаленная работа для программистов  •  Как заработать на Google AdSense  •  England, UK  •  статьи на английском  •  PHP MySQL CMS Apache Oscommerce  •  Online Business Knowledge Base  •  DVD MP3 AVI MP4 players codecs conversion help
Home  •  Search  •  Site Map  •  Set as Homepage  •  Add to Favourites

Copyright © 2005-2006 Powered by Custom PHP Programming

Сайт изготовлен в Студии Валентина Петручека
изготовление и поддержка веб-сайтов, разработка программного обеспечения, поисковая оптимизация