【问题标题】:php split array between two valuesphp在两个值之间拆分数组
【发布时间】:2011-05-12 12:12:25
【问题描述】:

我有一个类似的数组:

Array ( [0] => #!A1#DC [1] => #IMSR102.71/74.82 [2] => #HV50 [3] => #PR7/7/ [4] => #RX0 [5] => #ERN/1//0 [6] => #Q2 [7] => #!A1#DC [8] => #IMSR102.50/74.82 [9] => #HV40 [10] => #PR5/5/ [11] => #RX0 [12] => #ERN/1//1 [13] => #Q2 etc etc with hundreds o values

我从文件中获取这个数组(使用函数 file($filename) ),我需要将它拆分为多个子数组。

"!A1#DC" 这是一系列以#Q2结尾的值的开头,但开头和结尾之间的值的数量并不总是相同,只有2​​个值相同是两个给定的(“!A1#DC”为开头,“#Q2”为结尾) 我怎样才能得到这样的东西?

Array ( 
[0] => Array (  [0] => #!A1#DC [1] => #IMSR102.71/74.82 [2] => #HV50 [3] => #PR7/7/ [4] => #RX0 [5] => #ERN/1//0 [6] => #Q2 ) 
    [1] => Array (
     [1] => #!A1#DC [2] => #IMSR102.50/74.82 [3] => #HV40 [4] => #PR5/5/ [5] => #RX0 [6] => #ERN/1//1 [7] => #Q2 etc etc

你能帮帮我吗?

谢谢

【问题讨论】:

    标签: php arrays split associative-array


    【解决方案1】:

    遍历一个数组。当您达到起始值时,存储它的索引。当遇到结束值时,使用array_slice() 提取最后一对起始值和结束值之间的部分,将这部分存储到另一个数组中。

    $source = array (
        '#!A1#DC',
        '#IMSR102.71/74.82',
        '#HV50',
        '#PR7/7/',
        '#RX0',
        '#ERN/1//0',
        '#Q2',
        '#!A1#DC',
        '#IMSR102.50/74.82',
        '#HV40',
        '#PR5/5/',
        '#RX0',
        '#ERN/1//1',
        '#Q2',
    );
    
    $dest = array();
    
    $startValue = '#!A1#DC';
    $endValue = '#Q2';
    
    $startIndex = 0;
    foreach ( $source as $index => $value ) {
        if ( $value === $startValue ) {
            $startIndex = $index;
        } else
        if ( $value === $endValue ) {
            $dest[] = array_slice($source, $startIndex, $index - $startIndex + 1);
        }
    }
    
    print_r($dest);
    

    【讨论】:

      【解决方案2】:

      基本上,您需要遍历$input 的每个元素,将START 和END 元素中的元素收集到一个单独的数组中:

      $input = array("#!A1#DC", "A", "B", "#Q2");
      $values = array();
      $current = 0;
      
      define("START", "#!A1#DC");
      define("END", "#Q2");
      for ($i = 0; $i < count($input); $i++) {
          if ($input[$i] == END) {
              // Ignore any elements after this point until we see START
              $current = null;
          } else if ($input[$i] == START) {
              // Create a new current collection array
              $current = count($values);
              $values[$current] = array();
          } else {
              // Store the value if we are collecting
              if ($current !== null) {
                  $values[$current][] = $input[$i];
              }
          }
      }
      

      【讨论】:

      • 在循环条件下调用函数是浪费资源,如果保证每次迭代都返回相同的值-count($input)的值应该存储在一个变量中。
      • 相当肯定 PHP 会在内部缓存它,无论如何这是一个微优化。
      • PHP 不缓存它。这可能是一个微优化,也可能不是 - 取决于。谁知道呢,也许这个函数一年只被调用一次。但是,在具有大量数据的重负载系统上,它可能会节省几秒钟。 $array = range(1, 1000000)、for 循环在每次迭代中调用 count() 需要超过 10 秒,将 count() 存储在一个变量中并使用该变量 - 只需 0.2 秒。在每次迭代中使用变量并读取$array[$n] - 大约 0.4 秒。做这个变量不需要几个小时,这样做你不会失去一只手;)
      猜你喜欢
      • 1970-01-01
      • 2013-12-04
      • 1970-01-01
      • 1970-01-01
      • 2019-04-11
      • 2018-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多