Skrevet ons. d. 01. april 2009 kl. 17:00:58| #1
proev med:
usort($arr, "cmp");
hvor:
function cmp($a, $b) {
if($a[0] < $b[0]) {
return -1;
} else if($a[0] > $b[0]) {
return 1;
} else {
if($a[1] < $b[1]) {
return -1;
} else if($a[1] > $b[1]) {
return 1;
} else {
return 0;
}
}
}
Skrevet ons. d. 01. april 2009 kl. 19:29:07| #2
det fungerer ikke helt
$arr = array(
0 => array(2,4),
1 => array(0,19),
2 => array(7,2),
3 => array(3,5),
4 => array(3,7)
);
echo '<pre>';
print_r($arr);
echo '</pre>';
function cmp($a, $b) {
if($a[0] < $b[0]) {
return -1;
} else if($a[0] > $b[0]) {
return 1;
} else {
if($a[1] < $b[1]) {
return -1;
} else if($a[1] > $b[1]) {
return 1;
} else {
return 0;
}
}
}
usort($arr, "cmp");
echo '<pre>';
print_r($arr);
echo '</pre>';
Skrevet ons. d. 01. april 2009 kl. 19:30:45| #3
Skrevet ons. d. 01. april 2009 kl. 19:34:43| #4
er det her korrekt? :)
function cmp($a, $b)
{
if($a[0] < $b[0]) return 1;
elseif($a[0] > $b[0]) return -1;
else
{
if($a[1] < $b[1]) return 1;
elseif($a[1] > $b[1]) return -1;
else return 0;
}
}
Skrevet ons. d. 01. april 2009 kl. 19:51:55| #5
Koden i #2 sorterer ASC hos mig.
Mener du DESC ?
I saa fald er det bare at bytte om paa 1 og -1.
Skrevet ons. d. 01. april 2009 kl. 19:52:48| #6
cmp kan vist ioevrigt kortes lidt ned naar det er tal, da man bare kan traekke dem fra hinanden.
Skrevet ons. d. 01. april 2009 kl. 21:15:42| #7
ja, jeg skrev forkert først.. mente DESC
scriptet virker fint nu, men den "nulstiller" alle keys i første dimension i arrayet.. :(
Skrevet ons. d. 01. april 2009 kl. 21:20:13| #8
nøglen i første dimension virker som et id
men hvordan kan det kortes ned?
Skrevet ons. d. 01. april 2009 kl. 21:44:32| #9
eneste mulighed for at sortere på den her måde er så at flytte alle værdier inkl. id'et ud på samme "dimension"?
Skrevet ons. d. 01. april 2009 kl. 21:49:01| #10
function cmp($a, $b) {
if($a[0] == $b[0]) {
return $b[1] - $a[1];
} else {
return $b[0] - $a[0];
}
}
Skrevet ons. d. 01. april 2009 kl. 21:57:27| #11
hvordan vil cmp-funktionen se ud hvis jeg smider alle tre værdier på række?
altså
cmp($a, $b, $c)
- hvor $a er mit id og $b og $c er dem jeg skal sortere efter...
Skrevet ons. d. 01. april 2009 kl. 22:00:21| #12
min struktur ser nu således ud:
Array
(
[0] => Array
(
[0] => 23006
[1] => 1
[2] => 3
)
[1] => Array
(
[0] => 11258
[1] => 3
[2] => 1
)
[2] => Array
(
[0] => 26394
[1] => 1
[2] => 3
)
[3] => Array
(
[0] => 49385
[1] => 1
[2] => 5
)
[4] => Array
(
[0] => 70468
[1] => 1
[2] => 1
)
[5] => Array
(
[0] => 50911
[1] => 1
[2] => 1
)
[6] => Array
(
[0] => 74502
[1] => 1
[2] => 1
)
)
Skrevet ons. d. 01. april 2009 kl. 22:09:13| #13
function cmp($a, $b) {
if($a[0] == $b[0]) {
if($a[0] == $b[0]) {
return $b[2] - $a[2];
} else {
return $b[1] - $a[1];
}
} else {
return $b[0] - $a[0];
}
}
Skrevet ons. d. 01. april 2009 kl. 22:12:31| #14
jeg er ikke helt med? kunne man ikke "springe over" første værdi og sortere efter [1] og [2] i stedet? har mit id på [0]
Skrevet ons. d. 01. april 2009 kl. 22:13:42| #15
hov undskyld.. :)
resultatet på den seneste bliver sådan her
Array
(
[0] => Array
(
[0] => 74502
[1] => 1
[2] => 1
)
[1] => Array
(
[0] => 70468
[1] => 1
[2] => 1
)
[2] => Array
(
[0] => 50911
[1] => 1
[2] => 1
)
[3] => Array
(
[0] => 49385
[1] => 1
[2] => 5
)
[4] => Array
(
[0] => 26394
[1] => 1
[2] => 3
)
[5] => Array
(
[0] => 23006
[1] => 1
[2] => 3
)
[6] => Array
(
[0] => 11258
[1] => 3
[2] => 1
)
)
Array
(
[0] => Array
(
[0] => 74502
[1] => 1
[2] => 1
)
[1] => Array
(
[0] => 70468
[1] => 1
[2] => 1
)
[2] => Array
(
[0] => 50911
[1] => 1
[2] => 1
)
[3] => Array
(
[0] => 49385
[1] => 1
[2] => 5
)
[4] => Array
(
[0] => 26394
[1] => 1
[2] => 3
)
[5] => Array
(
[0] => 23006
[1] => 1
[2] => 3
)
[6] => Array
(
[0] => 11258
[1] => 3
[2] => 1
)
)
Skrevet ons. d. 01. april 2009 kl. 22:18:36| #16
sorry - jeg troede at du ville sortere efter alle felter
function cmp($a, $b) {
if($a[1] == $b[1]) {
return $b[2] - $a[2];
} else {
return $b[1] - $a[1];
}
}
Skrevet ons. d. 01. april 2009 kl. 22:21:04| #17
helt kanon.. det virker :)
jeg skal vist lige ind i den callback-ting her
smid et svar..
Skrevet ons. d. 01. april 2009 kl. 22:26:16| #18
Skrevet ons. d. 01. april 2009 kl. 22:27:26| #19
Hvis du brugte strenge som keys paa de indre arrays fremfor integers saa ville det maaske forbedre laesbarheden.
Hvis det skal vaere integers saa bruge konstanter.
Skrevet ons. d. 01. april 2009 kl. 22:35:08| #20
hvad mener du? er ikke helt med?
Skrevet ons. d. 01. april 2009 kl. 22:39:18| #21
strenge eller konstanter ?
Skrevet ons. d. 01. april 2009 kl. 22:46:58| #22
hvordan vil du bruge en konstant i eksemplet her?
men du mener at søgetiden ville optimeres hvis det var tekststrenge?
vil du ikke prøve at lave et eksempel med en array struktur?
Skrevet ons. d. 01. april 2009 kl. 23:01:19| #23
Nej - performance ville snaere blive ringere (men det vil skulle maales i milliardtedele sekunder) - men koden ville blive nemme at laese.
Skrevet ons. d. 01. april 2009 kl. 23:01:42| #24
Jeg kan lave et par eksempler.
Om en 3-4 timer.
Skrevet ons. d. 01. april 2009 kl. 23:14:22| #25
Skrevet tor. d. 02. april 2009 kl. 21:27:20| #26
Det tog lidt laengere tid.
:-)
Skrevet tor. d. 02. april 2009 kl. 21:27:30| #27
<?php
$arr = array(0 => array( 0 => 23006, 1 => 1, 2 => 3),
1 => array( 0 => 11258, 1 => 3, 2 => 1),
2 => array( 0 => 26394, 1 => 1, 2 => 3),
3 => array( 0 => 49385, 1 => 1, 2 => 5),
4 => array( 0 => 70468, 1 => 1, 2 => 1),
5 => array( 0 => 50911, 1 => 1, 2 => 1),
6 => array( 0 => 74502, 1 => 1, 2 => 1));
echo "<pre>\r\n";
foreach($arr as $elm) {
echo $elm[0] . " " . $elm[1] . " " . $elm[2] . "<br>\r\n";
}
echo "</pre>\r\n";
function cmp($a, $b) {
if($a[1] == $b[1]) {
return $b[2] - $a[2];
} else {
return $b[1] - $a[1];
}
}
usort($arr, "cmp");
echo "<pre>\r\n";
foreach($arr as $elm) {
echo $elm[0] . " " . $elm[1] . " " . $elm[2] . "<br>\r\n";
}
echo "</pre>\r\n";
?>
Skrevet tor. d. 02. april 2009 kl. 21:27:41| #28
<?php
$arr = array(0 => array( 'id' => 23006, 'v1' => 1, 'v2' => 3),
1 => array( 'id' => 11258, 'v1' => 3, 'v2' => 1),
2 => array( 'id' => 26394, 'v1' => 1, 'v2' => 3),
3 => array( 'id' => 49385, 'v1' => 1, 'v2' => 5),
4 => array( 'id' => 70468, 'v1' => 1, 'v2' => 1),
5 => array( 'id' => 50911, 'v1' => 1, 'v2' => 1),
6 => array( 'id' => 74502, 'v1' => 1, 'v2' => 1));
echo "<pre>\r\n";
foreach($arr as $elm) {
echo $elm['id'] . " " . $elm['v1'] . " " . $elm['v2'] . "<br>\r\n";
}
echo "</pre>\r\n";
function cmp($a, $b) {
if($a['v1'] == $b['v1']) {
return $b['v2'] - $a['v2'];
} else {
return $b['v1'] - $a['v1'];
}
}
usort($arr, "cmp");
echo "<pre>\r\n";
foreach($arr as $elm) {
echo $elm['id'] . " " . $elm['v1'] . " " . $elm['v2'] . "<br>\r\n";
}
echo "</pre>\r\n";
?>
Skrevet tor. d. 02. april 2009 kl. 21:27:51| #29
<?php
define('ID', 0);
define('V1', 1);
define('V2', 2);
$arr = array(0 => array( ID => 23006, V1 => 1, V2 => 3),
1 => array( ID => 11258, V1 => 3, V2 => 1),
2 => array( ID => 26394, V1 => 1, V2 => 3),
3 => array( ID => 49385, V1 => 1, V2 => 5),
4 => array( ID => 70468, V1 => 1, V2 => 1),
5 => array( ID => 50911, V1 => 1, V2 => 1),
6 => array( ID => 74502, V1 => 1, V2 => 1));
echo "<pre>\r\n";
foreach($arr as $elm) {
echo $elm[ID] . " " . $elm[V1] . " " . $elm[V2] . "<br>\r\n";
}
echo "</pre>\r\n";
function cmp($a, $b) {
if($a[V1] == $b[V1]) {
return $b[V2] - $a[V2];
} else {
return $b[V1] - $a[V1];
}
}
usort($arr, "cmp");
echo "<pre>\r\n";
foreach($arr as $elm) {
echo $elm[ID] . " " . $elm[V1] . " " . $elm[V2] . "<br>\r\n";
}
echo "</pre>\r\n";
?>
Skrevet tor. d. 02. april 2009 kl. 21:51:01| #30
<?php
class Data {
public $id;
public $v1;
public $v2;
public function __construct($idarg, $v1arg, $v2arg) {
$this->id = $idarg;
$this->v1 = $v1arg;
$this->v2 = $v2arg;
}
}
$arr = array(new Data( 23006, 1, 3),
new Data( 11258, 3, 1),
new Data( 26394, 1, 3),
new Data( 49385, 1, 5),
new Data( 70468, 1, 1),
new Data( 50911, 1, 1),
new Data( 74502, 1, 1));
echo "<pre>\r\n";
foreach($arr as $elm) {
echo $elm->id . " " . $elm->v1 . " " . $elm->v2 . "<br>\r\n";
}
echo "</pre>\r\n";
function cmp($a, $b) {
if($a->v1 == $b->v1) {
return $b->v2 - $a->v2;
} else {
return $b->v1 - $a->v1;
}
}
usort($arr, "cmp");
echo "<pre>\r\n";
foreach($arr as $elm) {
echo $elm->id . " " . $elm->v1 . " " . $elm->v2 . "<br>\r\n";
}
echo "</pre>\r\n";
?>
Skrevet tor. d. 02. april 2009 kl. 21:51:50| #31
Det sidste kunne goeres noget paenere ved at bruge noget ordentlig encapsulation.
Men min hoved pointe er bare at [1] og [2] i cmp ikke er specielt laesbar kode.
Skrevet fre. d. 03. april 2009 kl. 11:23:01| #32
nej ok.. kan godt se hvad du mener med konstanter :)
har aldrig anvendt konstanter før, men kunne være man skulle overveje det
tak for eksemplerne