diff options
author | Thies C. Arntzen <thies@php.net> | 1999-11-14 19:59:52 +0000 |
---|---|---|
committer | Thies C. Arntzen <thies@php.net> | 1999-11-14 19:59:52 +0000 |
commit | 2b08dfec2875932d3aeca1bef5007d8006be5ea9 (patch) | |
tree | 8f568558c791a1a2d4d9bda885c15ea3a08473bc | |
parent | f3bcc012c647e7c354d2d00cecf8364af58f922c (diff) | |
download | php-git-2b08dfec2875932d3aeca1bef5007d8006be5ea9.tar.gz |
(PHP k[r]sort) now use compare_function from libzend to be consistent with the language-core.
-rw-r--r-- | NEWS | 4 | ||||
-rw-r--r-- | ext/standard/array.c | 47 |
2 files changed, 35 insertions, 16 deletions
@@ -6,8 +6,8 @@ PHP 4.0 NEWS - Fixed selecting nested-tables in OCI8. (Thies) - RFC-854 fix for internal FTP-Code. Commands have to end in "\r\n" (Thies) - Fix OpenLink ODBC support (Stig) -- min(),max(),a[r]sort(),[r]sort() now work consistent with the language-core. - (Thies) +- min(),max(),a[r]sort(),[r]sort(),k[r]sort() now work consistent with the + language-core. (Thies) - tempnam() now uses mkstemp() if available (Stig) - serialize() and var_dump() now honor the precision as set in php.ini for doubles. (Thies) diff --git a/ext/standard/array.c b/ext/standard/array.c index 1615d3848a..cf8114a2b6 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -118,25 +118,44 @@ PHP_RINIT_FUNCTION(array) static int array_key_compare(const void *a, const void *b) { - Bucket *first; - Bucket *second; - int min, r; + Bucket *f; + Bucket *s; + pval result; + pval first; + pval second; + + f = *((Bucket **) a); + s = *((Bucket **) b); - first = *((Bucket **) a); - second = *((Bucket **) b); + if (f->nKeyLength == 0) { + first.type = IS_LONG; + first.value.lval = f->h; + } else { + first.type = IS_STRING; + first.value.str.val = f->arKey; + first.value.str.len = f->nKeyLength; + } - if (first->nKeyLength == 0 && second->nKeyLength == 0) { - return (first->h - second->h); - } else if (first->nKeyLength == 0) { + if (s->nKeyLength == 0) { + second.type = IS_LONG; + second.value.lval = s->h; + } else { + second.type = IS_STRING; + second.value.str.val = s->arKey; + second.value.str.len = s->nKeyLength; + } + + if (compare_function(&result, &first, &second) == FAILURE) { + return 0; + } + + convert_to_long(&result); + if (result.value.lval < 0) { return -1; - } else if (second->nKeyLength == 0) { + } else if (result.value.lval > 0) { return 1; - } - min = MIN(first->nKeyLength, second->nKeyLength); - if ((r = memcmp(first->arKey, second->arKey, min)) == 0) { - return (first->nKeyLength - second->nKeyLength); } else { - return r; + return 0; } } |