【问题标题】:Sort then split a PHP array?排序然后拆分PHP数组?
【发布时间】:2012-10-04 01:47:09
【问题描述】:

这是我的数组的var_dump

array(6) {
    [0]=> string(4) "quack"
    ["DOG"]=> string(4) "quack"
    [1]=> string(4) "quack"
    ["CAT"]=> string(4) "quack"
    [2]=> string(4) "Aaaaarrrrrggggghhhhh"
    ["CAERBANNOG"]=> string(4) "Aaaaarrrrrggggghhhhh"
}

(只是为了好玩,我在这段代码中包含了两个双关语,试着找到它们!)

如何将此数组拆分为两个数组,一个包含所有quacks;另一个Aaaaarrrrrggggghhhhh?


请注意,它并不总是按连续顺序排列,因此可能会考虑嵌套哈希图,例如:

  1. 检查if (isset($myarr['$found_val']))
  2. 如果找到则附加该数组
  3. 否则使用新数组创建该位置

但不确定数组是如何实现的,因此追加可能是 O(n),在这种情况下,我需要一些其他解决方案...

【问题讨论】:

    标签: php arrays split hashmap asymptotic-complexity


    【解决方案1】:

    您可以根据值对它们进行分组并存储键

    $array = array(0 => "quack","DOG" => "quack",1 => "quack","CAT" => "quack",2 => "Aaaaarrrrrggggghhhhh","CAERBANNOG" => "Aaaaarrrrrggggghhhhh");
    
    $final = array();
    foreach ( $array as $key => $value ) {
        if (! array_key_exists($value, $final)) {
            $final[$value] = array();
        }
        $final[$value][] = $key;
    }
    
    var_dump($final);
    

    输出

    array
      'quack' => 
        array
          0 => int 0
          1 => string 'DOG' (length=3)
          2 => int 1
          3 => string 'CAT' (length=3)
      'Aaaaarrrrrggggghhhhh' => 
        array
          0 => int 2
          1 => string 'CAERBANNOG' (length=10)
    

    【讨论】:

    • +1 击败了我 :) 但是我会做 $final[$value]=array($key); 稍微短一些 - 代替其他。附言。你有两个 var_dumps :)
    • @pebbl 对此感到抱歉... :)
    • 无论哪种方式我都会重写。为了防止在代码中多次这样做$final[$value][] = $key;。如果数组键不存在,只需创建元素并始终附加它。
    【解决方案2】:

    以防万一有人想以更奇怪的方式这样做:

    更新,使用 air4x 的想法,即仅使用单个项目数组,而不是 array_fill(0,count($a),$v)。让它更明智。

    $a = array(
      0 => "quack",
      "DOG" => "quack",
      1 => "quack",
      "CAT" => "quack",
      2 => "Aaaaarrrrrggggghhhhh",
      "CAERBANNOG" => "Aaaaarrrrrggggghhhhh"
    );
    
    $b = array();
    foreach( array_unique(array_values($a)) as $v ) {
      $b[$v] = array_intersect($a, array($v));
    }
    
    echo '<xmp>';
    print_r($b);
    

    完全不是最佳的 - 难以阅读 - 但仍然很有趣 :)

    【讨论】:

      【解决方案3】:

      试试这个

      $quacks_arr = array_intersect($your_array, array('quack'));
      $argh_arr   = array_intersect($your_array, array('Aaaaarrrrrggggghhhhh'));
      

      如果你想对它们进行排序,那么只需执行 ksort

      ksort($quacks_arr);
      ksort($argh_arr);
      

      【讨论】:

      • +1 我没有意识到我可以只为array_intersect 使用一项数组。我错误地认为它会与每个键偏移量进行比较。不错。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-08
      • 2019-07-23
      相关资源
      最近更新 更多