【问题标题】:PHP - split an array based on missing keys [closed]PHP - 根据缺少的键拆分数组[关闭]
【发布时间】:2012-07-12 07:44:16
【问题描述】:

这是我的代码:

Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 5 [6] => 6 [7] => 7 [8] => 8 [23] => 23 [24] => 24 )

它缺少一些键,我想根据这些缺失的键将此数组分成两部分,然后显示这两个数组中的最高和最低键...

前:0-8 & 23-24

帮助!

【问题讨论】:

  • 你有没有尝试过解决你的问题?
  • 我试过了,但老实说,我没有见过可以解决这个问题的 php 函数
  • 你只需要一个for循环和一点思考=)(这个问题没有php端解决方案)
  • 我确信 php 允许在一个程序中使用多个函数。你能用常规词来描述整个算法,作为获得所需结果的步骤列表吗?
  • 我有一个 24 小时的数组。 0 到 24,其中键与值匹配。我在数组中间取消了几个小时,因此删除了键和值。我现在想显示间隙每一侧的最低和最高值/键(缺少键)

标签: php arrays split


【解决方案1】:

这段代码可能会解决你的问题:

$arr = array("1" => "1", "2" => "2", "4" => "4", "5" => "5", "8" => "8", "9" => "9", "10" => "10", "11" => "11", "12" => "12", "16" => "16");
$arr_result = array();

$arr_keys = array_keys($arr);

$start = intval($arr_keys[0]);
$end = intval($arr_keys[count($arr_keys)-1]);

$group_idx = 0;

$idx = $start;
foreach($arr_keys as $x => $key) {
    if (intval($key) == intval($idx)) {
        $arr_result[$group_idx][$key] = $arr[$key];
        $idx++;
    } else {
        $group_idx++;
        $arr_result[$group_idx][$key] = $arr[$key];
        $idx = intval($key) + 1;
    }

}

print_r($arr_result);

我对其进行了测试,并且完全按照您的要求运行 :)。结果是:

Array
(
    [0] => Array
        (
            [1] => 1
            [2] => 2
        )

    [1] => Array
        (
            [4] => 4
            [5] => 5
        )

    [2] => Array
        (
            [8] => 8
            [9] => 9
            [10] => 10
            [11] => 11
            [12] => 12
        )

    [3] => Array
        (
            [16] => 16
        )

)

【讨论】:

    【解决方案2】:
    $test = array ("0" => 0, "1" => 1, "2" => 2, "3" => 3, "4" => 4, "5" => 5, "6" => 6, "7" => 7, "8" => 8, "23" => 23, "24" => 24, "25" => 25, "27" => 27, "28" => 28);
    
    $full = range(reset($test),end($test));
    $diff = (array_diff($full,$test));
    $found = FALSE;
    $start = reset($test);
    
    for ($i = 0; $i < count($full); $i++)
        {
        if (array_key_exists($i, $diff))
            {
            if (!$found)
                {
                $str[] = $start."-".($i-1);
                $start = NULL;
                }
    
            $found = TRUE;
            }
        else
            {
            if (is_null($start))
                $start = $i;
            $found = FALSE;
            }
        }
    
    $str[] = $start."-".($i-1);
    
    print_r($str);
    

    结果:

    Array
    (
        [0] => 0-8
        [1] => 23-25
        [2] => 27-28
    )
    

    【讨论】:

      【解决方案3】:
      $hours = range(0,24);
      for($i = 5; $i <= 16; ++$i)
          unset ($hours[$i]);
      
      foreach($hours as $key => $hour) {
          $hours[$key] = array($hour);
          if (isset($hours[$key-1])) {
              $hours[$key] = $hours[$key-1];
              $hours[$key][1] = $hour;
              unset($hours[$key-1]);
          }
      
      }
      $hours = array_values($hours);
      
      var_dump($hours);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-26
        • 2021-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-16
        相关资源
        最近更新 更多