【问题标题】:Array sort in php with multiple waysphp中的数组排序有多种方式
【发布时间】:2015-05-31 17:15:21
【问题描述】:

例如,我有两个数组 数组1:

Array(
    [id] => 50575
    [name] => Funbox - Pirates and Princesses
    [venue_id] => 3248
)

数组2:

Array
(
    [0] => Array
        (
            [id] => 53295
            [name] => Funbox - Pirates and Princesses
            [venue_id] => 2954
        )

    [1] => Array
        (
            [id] => 53323
            [name] => Funbox - Pirates and Princesses
            [venue_id] => 2954
        )

    [2] => Array
        (
            [id] => 53391
            [name] => Funbox - Pirates and Princesses
            [venue_id] => 2954
        )

    [3] => Array
        (
            [id] => 53402
            [name] => Funbox - Pirates and Princesses
            [venue_id] => 2954
        )

    [4] => Array
        (
            [id] => 57130
            [name] => Funbox - Pirates and Princesses
            [venue_id] => 2980
        )

    [5] => Array
        (
            [id] => 57142
            [name] => Funbox - Pirates and Princesses
            [venue_id] => 3248
        )

    [6] => Array
        (
            [id] => 50575
            [name] => Funbox - Pirates and Princesses
            [venue_id] => 3248
        )

    [7] => Array
        (
            [id] => 50601
            [name] => Funbox - Pirates and Princesses
            [venue_id] => 3248
        )

    [8] => Array
        (
            [id] => 56113
            [name] => Funbox - Pirates and Princesses
            [venue_id] => 2882
        )
)

数组 1 将是数组 2 中的任意一个子数组,

现在我希望在数组 2 中的第一个数组应该是数组 1 的数组,之后应该存在与数组 1 的场地 id 相同的那些子数组,然后是所有其他数组。 如何进行这种排序? 抱歉,如果有任何英语错误,我不擅长。

预期输出:

Array
    (
        [6] => Array
            (
                [id] => 50575
                [name] => Funbox - Pirates and Princesses
                [venue_id] => 3248
            )
        [5] => Array
            (
                [id] => 57142
                [name] => Funbox - Pirates and Princesses
                [venue_id] => 3248
            )
        [7] => Array
            (
                [id] => 50601
                [name] => Funbox - Pirates and Princesses
                [venue_id] => 3248
            )
        [0] => Array
            (
                [id] => 53295
                [name] => Funbox - Pirates and Princesses
                [venue_id] => 2954
            )

        [1] => Array
            (
                [id] => 53323
                [name] => Funbox - Pirates and Princesses
                [venue_id] => 2954
            )

        [2] => Array
            (
                [id] => 53391
                [name] => Funbox - Pirates and Princesses
                [venue_id] => 2954
            )

        [3] => Array
            (
                [id] => 53402
                [name] => Funbox - Pirates and Princesses
                [venue_id] => 2954
            )

        [4] => Array
            (
                [id] => 57130
                [name] => Funbox - Pirates and Princesses
                [venue_id] => 2980
            )
        [8] => Array
            (
                [id] => 56113
                [name] => Funbox - Pirates and Princesses
                [venue_id] => 2882
            )
    )

【问题讨论】:

  • 请举例说明预期结果应该如何。
  • now i want that in array 2 the first array should be that one which is array 1, after that those sub arrays which have venue id same as array 1 venue id should exist and then all other arrays. 没听懂..
  • 请用预期的输出编辑您的问题。
  • 也发布您的预期输出?
  • 等我这样做

标签: php arrays codeigniter


【解决方案1】:

这是一个自定义函数应该做你想做的:

 function sortArr($haystack, $needle){
        $out = array();

        foreach ($haystack as $index => $arr){
            if ($arr == $needle){
                $out["$index"] = $arr;
                unset ($haystack[$index]);
                break;
            } 
        }
        foreach ($haystack as $index => $arr){
            if ($arr['venue_id'] == $needle['venue_id']){
                $out["$index"] = $arr;
                unset($haystack[$index]);
            }
        }
        if (is_array($haystack)){
            return array_merge($out,$haystack);
        }

    }

以下是DEMO LINK

【讨论】:

    【解决方案2】:

    您可以使用usort 将其排序到您的示例顺序。

    function cmp($a, $b) {
      return $b["venue_id"] - $a["venue_id"];
    }
    
    usort($array2,"cmp"); 
    

    所有这一切都是按venue_id降序排序。所以所有具有相同venue_id的数组都会被分组,最高的venue_id在顶部。如果您想要其他东西,您的回答有点不清楚。

    编辑:我对此进行了更多思考,并提出了一个可以满足我认为您要求的功能。它并不完美,但应该可以。

    function customSort($array1,$array2) {
        global $primaryVenue_id;
        $primaryVenue_id = $array1["venue_id"];
        function cmp($a, $b) {
            global $primaryVenue_id;
            if ($a["venue_id"] == $primaryVenue_id) return -1;
            elseif ($b["venue_id"] == $primaryVenue_id) return 1;
            else return $b["venue_id"] - $a["venue_id"];
        }
    
        usort($array2, "cmp");
    
        unset($primaryVenue_id);
    
        return $array2;
    }
    

    基本上,如果您调用函数 customSort($array1,$array2),那么它将返回 $array2,所有子数组首先包含与 $array1 相同的场所 ID,然后是id的其余降序。

    【讨论】:

      【解决方案3】:

      您可以从第二个数组中取消设置匹配元素,然后使用 function array_unshift($array, $element); 预置数组。

      $needle = array(
        'id' => 50575,
        'name' => 'Funbox - Pirates and Princesses',
        'venue_id' => 3248
      );
      
      $stack = array(
        [0] => Array
              (
                  [id] => 53295
                  [name] => Funbox - Pirates and Princesses
                  [venue_id] => 2954
              )
      
          [1] => Array
              (
                  [id] => 53323
                  [name] => Funbox - Pirates and Princesses
                  [venue_id] => 2954
              )
      
          [2] => Array
              (
                  [id] => 53391
                  [name] => Funbox - Pirates and Princesses
                  [venue_id] => 2954
              )
      
          [3] => Array
              (
                  [id] => 53402
                  [name] => Funbox - Pirates and Princesses
                  [venue_id] => 2954
              )
      
          [4] => Array
              (
                  [id] => 57130
                  [name] => Funbox - Pirates and Princesses
                  [venue_id] => 2980
              )
      
          [5] => Array
              (
                  [id] => 57142
                  [name] => Funbox - Pirates and Princesses
                  [venue_id] => 3248
              )
      
          [6] => Array
              (
                  [id] => 50575
                  [name] => Funbox - Pirates and Princesses
                  [venue_id] => 3248
              )
      
          [7] => Array
              (
                  [id] => 50601
                  [name] => Funbox - Pirates and Princesses
                  [venue_id] => 3248
              )
      
          [8] => Array
              (
                  [id] => 56113
                  [name] => Funbox - Pirates and Princesses
                  [venue_id] => 2882
              )
      );
      
      foreach ($stack as $k => $v) {
        if ($v['id'] == $needle['id']) {
          unset($stack[$k]);
          array_unshift($stack, $needle);
          break;
        } else {
          //echo 'No matching element in existing array.';
        }
      }
      print_r($testArray);
      

      输出将是:

      Array
      (
          [0] => Array
              (
                  [id] => 50575
                  [name] => Funbox - Pirates and Princesses
                  [venue_id] => 3248
              )
      
          [1] => Array
              (
                  [id] => 53295
                  [name] => Funbox - Pirates and Princesses
                  [venue_id] => 2954
              )
      
          [2] => Array
              (
                  [id] => 53323
                  [name] => Funbox - Pirates and Princesses
                  [venue_id] => 2954
              )
      
          [3] => Array
              (
                  [id] => 53391
                  [name] => Funbox - Pirates and Princesses
                  [venue_id] => 2954
              )
      
          [4] => Array
              (
                  [id] => 53402
                  [name] => Funbox - Pirates and Princesses
                  [venue_id] => 2954
              )
      
          [5] => Array
              (
                  [id] => 57130
                  [name] => Funbox - Pirates and Princesses
                  [venue_id] => 2980
              )
      
          [6] => Array
              (
                  [id] => 57142
                  [name] => Funbox - Pirates and Princesses
                  [venue_id] => 3248
              )
      
          [7] => Array
              (
                  [id] => 50601
                  [name] => Funbox - Pirates and Princesses
                  [venue_id] => 3248
              )
      
          [8] => Array
              (
                  [id] => 56113
                  [name] => Funbox - Pirates and Princesses
                  [venue_id] => 2882
              )
      
      )
      

      【讨论】:

      • 我刚刚复制了您的输出代码。如果是字符串,则需要用引号将数组键和值包装起来。类似于我对$needle 所做的事情。 $stack 也应该是这样的。如果是这样,错误是什么?
      猜你喜欢
      • 2012-07-27
      • 2020-03-20
      • 1970-01-01
      • 1970-01-01
      • 2017-01-15
      • 1970-01-01
      • 2014-11-04
      • 1970-01-01
      • 2015-10-20
      相关资源
      最近更新 更多