diff options
| -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; } } |
