【问题标题】:PHP split array based on value [duplicate]基于值的PHP拆分数组[重复]
【发布时间】:2012-11-30 22:09:27
【问题描述】:

可能重复:
How to split an array based on a certain value?

这是我要拆分的示例数组:

(0, 1 ,2 ,3, 0, 4, 5)

我如何将它分成 2 个这样的数组?

(0, 1 ,2 ,3) (0, 4, 5)

基本上我想检查一个元素的值是否为零,然后创建一个包含所有元素的数组,直到找到另一个零。我似乎无法提出解决方案。

【问题讨论】:

  • array_keys() [with search value] 然后是 array_slice(),但我敢肯定有一个更好的主意

标签: php array-splice


【解决方案1】:
$array = array(0, 1 ,2 ,3, 0, 4, 5);
$result = array();
$index = -1;
foreach ($array as $number) {
    if ($number == 0) {
        $index++;
    }
    $result[$index][] = $number;
}
echo print_r($result, true);

您将以以下方式结束。

array(
    0 => array(0, 1, 2, 3),
    1 => array(0, 4, 5)
)

【讨论】:

  • 如果数组不以搜索值开头,则结果数组中的第一个键是-1而不是0。
【解决方案2】:
$x = -1;
$newArr = array();
$array = array(0,1,2,3,0,4,5,6);

foreach ($array as $key => $value) {
  if($value == 0) 
    $x++;

  $newArr[$x][] = $value;

}

【讨论】:

    【解决方案3】:

    您可以使用PHP explode 将每个出现的 0 分解为字符串数组,但我现在看到您有一个数组,而不是字符串。正如上面建议的那样,您可以使用相反的PHP implode

    【讨论】:

      【解决方案4】:
      <?php
      $a=array(0, 1 ,2 ,3, 0, 4, 5);
      $b =array();
      $k=-1;
      foreach($a as $key=>$val)
      {
          if($val==0)
          {
            $k++;  
          }
      
          $b[$k][]=$val;
      }
      
      
      echo"<pre>";
      
      
      
      print_r($b[0]);
      
      print_r($b[1]);
      
      
      foreach($b as $key=>$val)
      {
          echo"<pre>";
          echo $val;
          echo"</pre>";
      }
      ?>
      

      【讨论】:

        【解决方案5】:

        首先连接元素,然后使用 0 拆分,然后通过前缀 0 再次分隔它们,例如下面

        $concatenatedStr = implode(',', $array);
        $indx = 0;
        $fragments = array();
        $fragementStrings= explode("0,", $concatenatedStr);
        foreach($fragementStrings as $fragementString) {
          //you get your fragements here 
          $fragments[$indx++][] = explode(",", "0,".$fragementString);
        }
        

        【讨论】:

          【解决方案6】:

          类似于评论,array_keys 可用于搜索包含您搜索的值的所有键(在您的情况下为零)。

          然后您可以遍历这些位置并将数组切片(请参阅array_slice)到各个部分。

          示例 (Demo):

          $keys  = array_keys($array, 0);
          $parts = [];
          $last  = 0;
          
          foreach ($keys as $key)
          {
              $last !== $key 
                  && $parts[] = array_slice($array, $last, $key - $last, true);    
              $last = $key;
          }
          
          $parts[] = isset($key) ? array_slice($array, $key, null, true) : $array;
          

          这个变种甚至保留了原始密钥,示例 $parts 输出:

          array(2) {
            [0] => array(4) {
              [0] => int(0)
              [1] => int(1)
              [2] => int(2)
              [3] => int(3)
            }
            [1] => array(3) {
              [4] => int(0)
              [5] => int(4)
              [6] => int(5)
            }
          }
          

          另一种选择可能类似于概述的其他一些答案。以下变体也确实保留了密钥:

          $array = [0, 1 ,2 ,3, 0, 4, 5];
          $parts = [];
          $index = 0;
          
          foreach ($array as $key => $number)
          {
              $number == 0 and $key and $index++;
              $parts[$index][$key] = $number;
          }
          

          输出(Demo):

          Array
          (
              [0] => Array
                  (
                      [0] => 0
                      [1] => 1
                      [2] => 2
                      [3] => 3
                  )
          
              [1] => Array
                  (
                      [4] => 0
                      [5] => 4
                      [6] => 5
                  )
          
          )
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-12-31
            • 2011-12-20
            • 1970-01-01
            • 2015-04-08
            • 2020-05-01
            • 1970-01-01
            • 2018-12-29
            相关资源
            最近更新 更多