【问题标题】:Multi-dimension array value sorting in PHPPHP中的多维数组值排序
【发布时间】:2010-04-23 14:37:41
【问题描述】:

我正在构建一个数组,其中包含一组数据库字段,其中包含有关表、实际字段名称和描述性字段名称的信息作为多维数组。这是它目前的样子:

$Fields['User']['ID'] = "User ID";
$Fields['User']['FirstName'] = "First Name";
$Fields['Stats']['FavouriteOrder'] = "Favourite Item Ordered";
$Fields['Geographic']['Location'] = "Current Location";
$Fields['Geographic']['LocationCode'] = "Current Location Code";

好的,这很好,但我将其导入一个允许导出选定字段的系统,最后我想通过不同级别的 foreach(),提取数据,然后最终获得所有描述性字段使用其描述性名称按字母顺序显示。所以最终的顺序是:当前位置、当前位置代码、订购的最喜欢的项目、名字然后是用户 ID - 显然保持索引关联。

我不能使用 usort() 也不能使用 array_multisort()... 或者我可以但我不知道怎么做。 usort() 似乎需要一个键来排序,但我有可变键。 array_multisort() 似乎真的和 sort() 一样。

【问题讨论】:

  • 你将值存储在该结构中的什么位置?
  • 值是引号中的项目......我基本上是将描述与特定表中的特定字段相关联。
  • 对不起,我对字段名称和值感到困惑,您能发布一个您预期的最终输出示例吗?
  • 没关系,kemp,感谢您的帮助,我将剖析原始数组,而不是根据值重建它,然后重新格式化它(见下面我的帖子)......所有好:)
  • $Fields['Geographic']['Location'] 是谁的位置?

标签: php sorting arrays multidimensional-array


【解决方案1】:

这仅适用于二维数组。不是我写过的最优雅的代码,但它确实有效......

    foreach($Fields as $key=>$var) {
        ksort($var);
        $Fields[$key]=$var;
    }
    ksort($Fields);

【讨论】:

    【解决方案2】:

    让我宁愿举一个真实的数据示例,而不是假数据,因为假数据几乎让我感到困惑。所以,假数据被评论了。

    /*
    $Fields['User']['ID'] = "User ID";
    $Fields['User']['FirstName'] = "First Name";
    $Fields['Stats']['FavouriteOrder'] = "Favourite Item Ordered";
    $Fields['Geographic']['Location'] = "Current Location";
    $Fields['Geographic']['LocationCode'] = "Current Location Code";
    */
    
    $Fields['Product']['ReferenceNumber'] = "Product Reference Number";
    $Fields['Product']['Halaal'] = "Halaal Status";
    $Fields['Product']['Kosher'] = "Kosher Status";
    $Fields['Product']['KosherType'] = "Kosher Type";
    $Fields['Product']['CuringSalts'] = "Curing Salts Status";
    $Fields['Product']['ProductVisibility'] = "Product Visibility";
    $Fields['Product']['ProductStatus'] = "Product Status";
    $Fields['Product']['PackBarCode'] = "Barcode";
    $Fields['Product']['ProductDescription'] = "Product Description";
    $Fields['Pack']['PackSize'] = "Pack Size";
    $Fields['Pack']['PackSizeNumeric'] = "Numeric Pack Size";
    $Fields['Allergens']['ContainsNuts'] = "Product Contains Nuts";
    
    
    foreach ($Fields as $key => $value) {
        ksort($value);
        $Fields[$key] = $value;
    }
    ksort($Fields);
    

    我有一个“那些”星期五... print_r($Fields) 显示键正在排序并且值是关联的,但它仍然是按键而不是最终值排序。

    这几乎就像我需要一个反向排序系统,它首先检查所有值,对它们进行排序,然后说'好的,你属于哪里......啊,你属于表 Y 中的 FieldX'

    我希望有一个偷偷摸摸的聪明方法,也许有,但我想我会写一个函数来解析数据,写一个反转数组,然后按值顺序重写原始数组.效率极低,但它会做。

    尽管如此,我们仍然愿意接受更好的建议!

    【讨论】:

      【解决方案3】:

      我昨天确实不得不为我正在从事的一个项目解决这个问题 - 这是我的代码:

      资源数组如下所示:

      $resource[$count]['title']
      $resource[$count]['filepath']
      $resource[$count]['filename']
      $resource[$count]['taxonomy'][0]
      

      按标题 ASC 或 DESC 排序的几个排序函数

      function compare_asc($a, $b) {
          return strcmp($a['title'], $b['title']);
      }
      function compare_desc($a, $b) {
          if ($a['title'] == $b['title']) {
              return 0;
          }
          return ($a['title'] > $b['title']) ? -1 : 1;
          //return strcmp($a['title'], $b['title']);
      }
      

      最后在你循环 $resource 并输出你需要的任何东西之前使用 usort 做脏东西。

      usort($resource, "compare_asc");
      

      【讨论】:

        【解决方案4】:

        好吧,它一点也不优雅。所以我不鼓励使用它,并且会寻找更好的方法。但这是我得到的解决方案,适用于上面和下面的示例。

        不幸的是,按照我想要的方式,数组必须包含一个前面的“排序”编号,所以我想我从一开始就失败了。但现在可以了。

        $TempDescArray = array();
        $TempFieldArray = array();
        $TempTableArray = array();
        $Pointer = 0;
        
        foreach ($Fields as $Table => $FieldsArray) {   
            foreach ($FieldsArray as $Field => $Description) {
                $TempDescArray[$Pointer] = $Description;
                $TempFieldArray[$Pointer] = $Field;
                $TempTableArray[$Pointer] = $Table;
                $Pointer++;
            }
        }
        
        asort($TempDescArray);
        $Fields = array();
        $Pointer2 = 0;
        
        foreach ($TempDescArray as $Pointer => $Description) {
            $Fields[$Pointer2][$TempTableArray[$Pointer]][$TempFieldArray[$Pointer]] = $Description;
            $Pointer2++;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-28
          相关资源
          最近更新 更多