php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #25879 SORT_ASC when passed into a function can NOT be passed as a string
Submitted: 2003-10-15 08:25 UTC Modified: 2003-10-16 03:42 UTC
From: it at oh-barcelona dot com Assigned:
Status: Not a bug Package: Variables related
PHP Version: 4.3.2 OS: Windows
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: it at oh-barcelona dot com
New email:
PHP Version: OS:

 

 [2003-10-15 08:25 UTC] it at oh-barcelona dot com
Description:
------------
Hello,
   I've found a perplexing bug with sorting flags.  When you create a function to create (for example) an dynamic array_multisort() and one of the arguements which is passed is a SORT_ASC (or any other flag) which is used to create the array_multisort() it MUST be passed without quotes and not as a string.

In the example below you will see that if you gettype() of the $arg the SORT_DESC returns an integer not a string when passed without quotes and a string with.  

If the SORT flag is passed as a string the array_multisort acts as if it were null.

This stops me from setting the SORT flag via if statement. 

I have written a work around but this problem should be addressed because if you settype() a string it becomes "0".

The function call is:
 $ new_array = array_column_sort($someArray,'column',SORT_DESC)

The function does not work if you use:
$sortFlag = "SORT_ASC"; 
 $ new_array = array_column_sort($someArray,'column',$sortFlag )



Reproduce code:
---------------
function array_column_sort(){ 
  $args = func_get_args();
  $array = array_shift($args);
  // make a temporary copy of array for which will fix the 
  // keys to be strings, so that array_multisort() doesn't
  // destroy them
  $array_mod = array();
  foreach ($array as $key => $value)
    $array_mod['_' . $key] = $value;
  
  $i = 0;
  $multi_sort_line = "return array_multisort( ";
  foreach ($args as $arg)  {
      $i++;
      if ( is_string($arg) ){
          foreach ($array_mod as $row_key => $row){
              $sort_array[$i][] = $row[$arg];
          }
      }else{
          $sort_array[$i] = $arg;
      }
      $multi_sort_line .= "\$sort_array[" . $i . "], ";
  }
  $multi_sort_line .= "\$array_mod );"; 
  eval($multi_sort_line);
  // now copy $array_mod back into $array, stripping off the "_"
  // that we added earlier.
  $array = array();
  foreach ($array_mod as $key => $value)
    $array[ substr($key, 1) ] = $value;

  return $array;
}

Expected result:
----------------
The array should be sorted by column and SORT flag.

Actual result:
--------------
The array_multisort only excepts the SORT flag without quotes and not as a string.

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2003-10-15 11:22 UTC] mgf@php.net
Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to report
a bug at http://bugs.php.net/how-to-report.php

SORT_ASC, SORT_DESC, etc. are constants, not strings, so just treat them as if they were numeric values:

$sortFlag = SORT_ASC; 
$new_array = array_column_sort($someArray,'column',$sortFlag)


 
PHP Copyright © 2001-2025 The PHP Group
All rights reserved.
Last updated: Wed Jul 09 14:01:33 2025 UTC