[Programming] Lập trình PHP: anh nào giúp em viết hàm sort array với ! |
06/07/2010 16:26:14 (+0700) | #1 | 214789 |
Azx
Member
|
0 |
|
|
Joined: 05/07/2010 22:50:36
Messages: 9
Location: black hole
Offline
|
|
Em chào các đại ka! Em đang tập lập trình PHP, các Bro biết PHP giúp em làm cái này với với
Em có một mảng đối tượng như danh sách dưới:
Code:
IP Hits
1 3
2 5
3 7
4 9
5 2
Em muốn viết một hàm sắp xếp lại mảng này theo thứ tự giảm dần của trường Hits giống như danh sách sau:
Code:
IP Hits
4 9
3 7
2 5
1 3
5 2
Các đại ka giúp em với nhé, em xin cảm ơn lắm lắm
Code:
<?php
$data = '[{"ip":"1","hits":3},{"ip":"2","hits":5},{"ip":"3","hits":7},{"ip":"4","hits":9},{"ip":"5","hits":2}]';
$data = json_decode($data);
$data = order_by_hist($data);
echo '<pre>';print_r($data);echo '</pre>';
function order_by_hist($data){
#todo: order array $data theo gia tri giam dan cua truong Hits
}
?>
|
|
|
|
|
[Programming] lập trình PHP: anh nào giúp em viết hàm sort array với ! |
07/07/2010 03:50:33 (+0700) | #2 | 214804 |
ManhQuan9x
Member
|
0 |
|
|
Joined: 26/08/2007 14:43:31
Messages: 11
Offline
|
|
Bài viết của bạn sai box rồi . nhưng dù sao vẫn cứ reply hy vọng là bạn này đọc được
1.Thực sự mình nhìn code của bạn mình chả hiểu gì cả, bạn tự học PHP à.
2.Bạn cần học thêm cách trình bày khi viết code.
3.Bạn xem lại thứ tự " với ' theo thứ tự này " ' ' "
4.Bạn có hiểu hàm function là gì không, mà sao bạn lại có thể gọi nó trước khi khai báo nó vậy, bạn lên nghĩ một chương trình xử lí code bao giờ cũng xử lí từ trên xuống dưới từ trái sang phải. Bạn lên để các function lên phía đầu code ( theo phong cách trình bày code ).
5.Cuối cùng bạn có thể miêu tả bằng lời cách hiển thị cái biến $data ở đoạn code của bạn được không .
Đoạn code ở dưới sẽ hiển thị như bạn đã trình bày ở bài viết của bạn, mình không có nhiều thời gian lên chỉ viết được vậy thôi.
Code:
<?php
function Xsort($data) {
arsort($data);//Đây là lệnh sắp xếp.
foreach($data as $ip => $hits) {
//Viêt thế này
echo "<pre>".$ip." ".$hits."</pre>";
//hoặc viết thế này
//echo "<pre>$ip $hits</pre>";
//đó chỉ là phong cách viết thôi.
}
}
$data = array("1" => "3", "2" => "5", "3" => "7", "4" => "9", "5" => "2");
echo "<pre>IP Hits</pre>";
Xsort($data);
?>
Bạn có thể tìm hiều thêm tại đây : http://vn2.php.net/manual/en/book.array.php |
|
|
|
|
[Programming] Lập trình PHP: anh nào giúp em viết hàm sort array với ! |
07/07/2010 22:00:27 (+0700) | #3 | 214857 |
Azx
Member
|
0 |
|
|
Joined: 05/07/2010 22:50:36
Messages: 9
Location: black hole
Offline
|
|
ManhQuan9x wrote:
Bài viết của bạn sai box rồi smilie. nhưng dù sao vẫn cứ reply hy vọng là bạn này đọc được
Bạn hay ai đó có thể chỉ cho mình biết bài viết của mình nên gửi vào box nào thì mới đúng chỗ không? trước khi post mình đã tìm nhưng mà không thấy. Hình như không có chỗ chính thức cho những bài như thế này ở đây
ManhQuan9x wrote:
1.Thực sự mình nhìn code của bạn mình chả hiểu gì cả, bạn tự học PHP à.
Đúng là mình đang tự học PHP. Nhưng mình không nghĩ là code của mình lại khó hiểu đến thế Bạn có thể chỉ ra bạn không hiểu chỗ nào không?
ManhQuan9x wrote:
2.Bạn cần học thêm cách trình bày khi viết code.
Bạn có thể chỉ cho mình thấy những chỗ không ổn trong cách trình bày code của mình không?
ManhQuan9x wrote:
3.Bạn xem lại thứ tự " với ' theo thứ tự này " ' ' "
Bạn có thể giải thích tại sao lại phải " ' ' " mà không phải ' " " ' không?
ManhQuan9x wrote:
4.Bạn có hiểu hàm function là gì không, mà sao bạn lại có thể gọi nó trước khi khai báo nó vậy, bạn lên nghĩ một chương trình xử lí code bao giờ cũng xử lí từ trên xuống dưới từ trái sang phải. Bạn lên để các function lên phía đầu code ( theo phong cách trình bày code ).
Thực sự mình cũng chỉ biết dùng sơ sơ chứ cũng không hiểu sâu cho lắm. Nhưng mình thấy khai báo như thế nó vẫn chạy được . Đây có là quy định bắt buộc hay chỉ là phong cách của bạn?
ManhQuan9x wrote:
5.Cuối cùng bạn có thể miêu tả bằng lời cách hiển thị cái biến $data ở đoạn code của bạn được không smilie .
Trong đoạn code của mình chỉ có một dòng có chức năng hiển thị cái biến $data:
Code:
echo '<pre>';print_r($data);echo '</pre>';
Mô tả bằng lời cách hiển thị này là sao nhỉ? Mình chỉ thấy cách của mình tốn ít code mà vẫn hiển thị đủ rõ cấu trúc và giá trị của mảng. Mình nghĩ không cần quá cầu kì ở chỗ này
Tiếc là bạn đã hiểu sai cấu trúc mảng của mình nên đoạn code của bạn vẫn chưa giúp được mình. Mảng của mình là mảng mà các phần tử của nó là một đối tượng có 2 (có thể nhiều hơn 2) thuộc tính là IP và Hits. Bạn giúp mình lại nhé
Code:
Array
(
[0] => stdClass Object
(
[ip] => 1
[hits] => 3
)
[1] => stdClass Object
(
[ip] => 2
[hits] => 5
)
[2] => stdClass Object
(
[ip] => 3
[hits] => 7
)
[3] => stdClass Object
(
[ip] => 4
[hits] => 9
)
[4] => stdClass Object
(
[ip] => 5
[hits] => 2
)
)
|
|
|
|
|
[Programming] Lập trình PHP: anh nào giúp em viết hàm sort array với ! |
08/07/2010 01:13:49 (+0700) | #4 | 214863 |
|
learn2hack
Elite Member
|
0 |
|
|
Joined: 29/06/2006 16:32:37
Messages: 825
Offline
|
|
@Azx: bạn nghiên cứu lệnh usort() nhé:
http://php.net/usort
VD của bạn có thể làm như sau:
Code:
function cmp($a, $b) {
if ($a->hits == $b->hits) {
return 0;
}
return ($a->hits > $b->hits) ? -1 : 1;
}
usort($data, 'cmp');
|
|
Blog: http://hontap.blogspot.com
Tải phần mềm miễn phí: http://www.taiphanmem.org |
|
|
|
[Programming] Lập trình PHP: anh nào giúp em viết hàm sort array với ! |
08/07/2010 08:13:24 (+0700) | #5 | 214868 |
ManhQuan9x
Member
|
0 |
|
|
Joined: 26/08/2007 14:43:31
Messages: 11
Offline
|
|
Azx wrote:
Bạn hay ai đó có thể chỉ cho mình biết bài viết của mình nên gửi vào box nào thì mới đúng chỗ không? trước khi post mình đã tìm nhưng mà không thấy. Hình như không có chỗ chính thức cho những bài như thế này ở đây
Cái này à, phải cho vào mục thảo luận khác mới đúng chứ nó có liên quan gì tới hệ điều hành đâu mà lại post vô đây . Phải post vào box những thảo luận khác mới đúng chứ ).
Azx wrote:
Đúng là mình đang tự học PHP. Nhưng mình không nghĩ là code của mình lại khó hiểu đến thế smilie Bạn có thể chỉ ra bạn không hiểu chỗ nào không?
Mình cũng là người tự học.
Azx wrote:
Bạn có thể chỉ cho mình thấy những chỗ không ổn trong cách trình bày code của mình không?
Cái này cho qua nhé !
Code:
Bạn có thể giải thích tại sao lại phải " ' ' " mà không phải ' " " ' không?
Ở đoạn code mình đưa ra ở phia dưới chỗ "\n" bạn thử thay nó là '\n' xem nó sẽ như nào, tự ngẫm nhé bạn, khi sử dụng dấu ' hoặc " trong một số trường hợp ta không thể sử dụng dấu ' được hoặc bất tiện thì trong mọi trường hợp ta có thể thể sử dụng được dấu " còn \n kia là gì thì bạn tự tìm hiểu nhé.
Azx wrote:
Thực sự mình cũng chỉ biết dùng sơ sơ chứ cũng không hiểu sâu cho lắm. Nhưng mình thấy khai báo như thế nó vẫn chạy được smilie. Đây có là quy định bắt buộc hay chỉ là phong cách của bạn?
Tất nhiên là được rồi, chỉ cần đặt nó lên trước đoạn code mà mình cần sử dụng là được nhưng có 1 vài vấn đề cần chú ý.
1. Nó như là thư viện liên kết động vậy, như mấy file .exe có file .dll đi kèm vậy đó, và những function thường được viết ra để sử dụng trong nhiều đoạn code khác nhau, và sử dụng đi sử dụng lại nhiều lần nó giống như cái hàm sort, asort, arsort, rsort..... vậy chỉ có điều ở đây là do mình viết ra
2. Bạn thử để ý xem nếu một đoạn code tầm 10 nghìn dòng mà lại đặt theo kiểu cứ một đoàn lại có một cái function, một đoạn lại có một cái function... thì thẩm mĩ code nó se như thế nào chưa kể đến chỉnh sửa lại khó mà một số đoạn code function có thể là cái móng, cốt lõi của một trang web. Vì vậy chúng có thể cho nó vào hàm include("file.php" rồi vứt nó ra một chỗ khác. Code vừa đỡ dài dễ nhìn mà khi chỉnh sửa function thì lại dễ ........ nói chung là lên để nó lên đầu không chỉ mình mình làm vậy mà hầu như tất cả mọi người đều làm vậy, rồi sau đó chúng ta cứ gõ gõ từng lệnh từng lệnh một như cái hàm sort đó ghép lại thế là thành một trang web
Azx wrote:
Mô tả bằng lời cách hiển thị này là sao nhỉ? Mình chỉ thấy cách của mình tốn ít code mà vẫn hiển thị đủ rõ cấu trúc và giá trị của mảng. Mình nghĩ không cần quá cầu kì ở chỗ này
à rồi, giờ thì mình đã hiều
Code:
<?php
$Statistics = array(
array(
'IP' => '1',
'Hits' => '3',
),
array(
'IP' => '2',
'Hits' => '5',
),
array(
'IP' => '3',
'Hits' => '7',
),
array(
'IP' => '4',
'Hits' => '9',
),
array(
'IP' => '5',
'Hits' => '2',
),
);
foreach($Statistics as $order => $data) {
$sort[$order] = "$data[Hits]\t$data[IP]";
}
rsort($sort);
for($i = 0; $i < count ( $sort ); $i++){
echo $sort[$i]."\n";
}
?>
Bạn có thể tham khảo thêm đoạn code trên, với đoàn code trên bạn có thể bạn cần lấy hàm explode để tách đoạn text từ $sort[$i] để gán vào các biến, cũng như array
Cái khó khi mình viết đoạn code trên là cái array trong trường hợp này của bạn ( cái Hits và IP không động đậy được thì phải) bạn lên tư duy lại, mình liên tưởng nó như kiểu trong thành phố có nhiều quận Code:
$array = array();// Một quận
Trong một quận có nhiều phường
Code:
$array = array( array (), array(), ); // Có hai phường
Mỗi phường có một người lớn tuổi nhấtCode:
$array = array( array ('Hits' => '7',), array('Hits' => '6',), );// có được 2 người lớn tuổi ở 2 phường.
Vấn đề ở đây là bạn chạy lon ton trong thành phố lấy địa chỉ từng quận, rồi đi từng quận lấy địa chỉ từng phường, rồi vào từng phường lấy được số tuổi của người cao tuổi nhất ( may mà chưa vào từng nhà ). cứ như vậy cho tới khi lấy được một danh sáchCode:
foreach($Statistics as $order => $data) {$sort[$order] = "$data[Hits]\t$data[IP]";}
rồi bạn lại chép từ cái danh sách ghi người lớn tuổi vào cái danh sách địa chỉ rồi bắt đầu ngồi so sánh.
Thay vì người đã chuẩn bị cho mình từ trước một danh sách ở đâu dó một cách dễ dàng như thế này chẳng hạn
Code:
$array[$TP][$Q][$P][$T][$Add];//đó là một danh sách và số thứ tự được lấy qua hàm đếm count ($array) duyệt bằng một cái máy bằng vòng for.
còn ở danh sách của bạn thì được duyệt bằng một loạt số thứ tự là Hits y chăng nhau và vòng vèo mãi mới lấy được dữ liệu cần duyệt
Cái array nó có một địa chỉ chung dễ gọi thì bạn lại táng cho nó một cái tên để đến lúc gọi ( Hits, IP) để rồi mỗi lần gọi lại vất vả chạy đi chạy lại, và đặc biệt là nó không động đậy được.
Mình xin rút khỏi topic này vì kiến thức có hạn chỉ có thể góp ý cho bạn được vậy thôi.
Ở trên là chém gió đấy có kilomet nào chưa đủ gió thì mong mọi người góp gió thành bão ) ) )
@learn2hack:đoạn code của bạn thật là uyên thâm , nó rất ngắn gọn , nhưng mình không hiểu với đoạn code kia thì địa chỉ IP, ít nhất là ở bài viết này nó sẽ ở đâu nếu khi sắp xếp danh sách cần phải đi kèm them với các thông tin khác. Mà hình chư hàm sắp xếp có sẵn của PHP không hỗ trợ sắp xếp mảng có nhiều chỉ mục thì phải không biết có đúng không . |
|
|
|
|
[Programming] Lập trình PHP: anh nào giúp em viết hàm sort array với ! |
08/07/2010 14:37:21 (+0700) | #6 | 214892 |
|
learn2hack
Elite Member
|
0 |
|
|
Joined: 29/06/2006 16:32:37
Messages: 825
Offline
|
|
@ManhQuan9x: bạn đọc thêm về usort() theo link mình đã dẫn sẽ hiểu nhiều hơn, ở đây mình giải thích cơ bản thôi nhé:
usort() (viết tắt của user-defined sort) là hàm sắp xếp do người dùng định nghĩa. Cái mà người dùng định nghĩa ở đây (hàm cmp() trong ví dụ trên) là thứ tự của 2 phần tử A và B được sắp xếp. 2 phần tử đó có thể là bất cứ thứ gì (mảng, xâu, số nguyên, ...). Hàm so sánh chỉ cần trả về 3 giá trị:
+ 0 nếu A và B có cùng vị trí
+ -1 nếu A đứng trước B trong thứ tự sắp xếp
+ 1 nếu A đứng sau B trong thứ tự sắp xếp
Thông thường hàm so sánh chỉ lấy 1 thông tin nào đó của A và B để so sánh, trong VD trên lấy thông tin Hits. Toàn bộ thông tin khác của A và B, VD như IP, đều được bảo toàn (nói thế này hơi trừu tượng, tốt nhất bạn nên print_r() mảng đã được sắp xếp thì sẽ hiểu).
Về việc sắp xếp mảng đa chiều, PHP cũng có hỗ trợ, bạn xem thêm hàm array_multisort().
PS: Những cái này google là có hết mà, trên php.net còn có rất nhiều ví dụ kèm theo. |
|
Blog: http://hontap.blogspot.com
Tải phần mềm miễn phí: http://www.taiphanmem.org |
|
|
|
[Programming] Lập trình PHP: anh nào giúp em viết hàm sort array với ! |
08/07/2010 16:32:34 (+0700) | #7 | 214896 |
ManhQuan9x
Member
|
0 |
|
|
Joined: 26/08/2007 14:43:31
Messages: 11
Offline
|
|
@learn2hack: Thank bạn nhé ^^!, mình cũng chỉ tự học để viết một trang web cá nhân lên cũng không hiểu sâu được cho lắm, đọc xong cái của bạn mình chả hiểu gì cả , mà bạn có thể nói cho mình cái ý nghĩa của dấu -> và dấu ? được không theo mình biết thì dấu ? như một cách viết tắt dựa trên biểu thức boolean còn còn dấu -> thì mình thấy trong lập trình đối tượng PHP sử dụng rất nhiều mình chỉ biết nó là dấu truy xuất thuộc tính/phương thứ của 1 object trong, bạn có thể cho mình một ví dụ đơn giản và giải thích nó được không.
Hoặc bạn nào ghé qua topic này mà biết thì chỉ giúp mình nhé.
@Azx:
Code:
<?php
$Statistics = array(
array(
'IP' => '1',
'Hits' => '3',
),
array(
'IP' => '2',
'Hits' => '5',
),
array(
'IP' => '3',
'Hits' => '7',
),
array(
'IP' => '4',
'Hits' => '9',
),
array(
'IP' => '5',
'Hits' => '2',
),
);
function cmp($a, $b)
{
if ($a == $b ) {
return 0;
}
return ($a > $b ) ? 1: 1;
}
usort($Statistics, "cmp");
foreach($Statistics as $order => $data) {
echo "<pre>".$data[Hits]." ".$data[IP]."</pre>";
}
?>
|
|
|
|
|
[Programming] Lập trình PHP: anh nào giúp em viết hàm sort array với ! |
08/07/2010 20:09:22 (+0700) | #8 | 214904 |
Azx
Member
|
0 |
|
|
Joined: 05/07/2010 22:50:36
Messages: 9
Location: black hole
Offline
|
|
Code:
function cmp($a, $b) {
if ($a->hits == $b->hits) {
return 0;
}
return ($a->hits > $b->hits) ? -1 : 1;
}
usort($data, 'cmp');
@learn2hack: Thanks đại kha rất nhiều! Đây chính xác là thứ em muốn thu được khi lập topic này
Thực ra trước khi lập topic em đã viết được hàm sắp xếp cái mảng đó, nhưng theo cách "nông dân"
Code:
function order_by_hist($data){
$hits = array();
foreach ($data as $item){
$hits[]=$item->hits;
}
asort($hits);
$rows = array();
foreach ($hits as $k=>$hits){
$rows[] = $data[$k];
}
$data = array();
$max = count($rows) -1;
for ($i=$max;$i>=0;$i--){
$data[] = $rows[$i];
}
return $data;
}
Em thấy một việc đơn giản vậy mà phải tốn nhiều code như em viết có vẻ không ổn. Và em cũng đoán rằng PHP có hàm nào đó hỗ trợ việc này, nhưng với trình độ vẫn còn còi cọc của mình em không thể tìm ra từ khoá nào phù hợp cho vấn đề này để cho vào google. Nên em đã đánh liều lập topic này ở đây. Thật may là lúc đó em chưa nhìn thấy cái Quy định về việc tạo các chủ đề "Lập trình" ở ngoài kia
Từ giờ thì em không dám post những bài tương tự như thế này ở đây nữa roài . Có đại ka nào biết diễn đàn nào có nhiều người giỏi và cho phép post những bài như thế này thì làm ơn chỉ hộ em Zzới ..!! Em xin cảm ơn lắm lắm
|
|
|
|
|
|