繁体   English   中英

相同的操作,不同的结果

[英]Same operation, different result

我的目标是将数组(带有子数组)转换为HTML表。 为此,我必须计算一些行跨度。 首先,给我数组$ table的var_dump:

array(3) {
  ["BOUYGUES TELECOM"]=>          /* Mobile carrier */
  array(4) {
    ["number"]=>
    string(5) "72967"
    ["date_ok"]=>
    string(10) "04/10/1996"
    ["date_ok_edit"]=>
    string(10) "20/09/2013"
    ["azimuth"]=>
    array(4) {
      ["66.00"]=>                /* Azimuth of an antenna */
      array(1) {
        ["26.00"]=>              /* Height (from floor) of the antenna */
        array(1) {
          ["FH"]=>               /* System/Technology used */
          array(1) {
            [0]=>                /* Ranges of frequencies */
            string(18) "37.26 à 37.50 GHz"
          }
        }
      }
      ["80.00"]=>
      array(1) {
        ["26.00"]=>
        array(5) {
          ["GSM 1800"]=>
          array(2) {
            [0]=>
            string(22) "1758.30 à 1784.90 MHz"
            [1]=>
            string(22) "1853.30 à 1879.90 MHz"
          }
          ["GSM 900"]=>
          array(2) {
            [0]=>
            string(20) "880.10 à 889.90 MHz"
            [1]=>
            string(20) "925.10 à 934.90 MHz"
          }
          ["LTE 1800"]=>
          array(2) {
            [0]=>
            string(22) "1765.00 à 1785.00 MHz"
            [1]=>
            string(22) "1860.00 à 1880.00 MHz"
          }
          ["UMTS 2100"]=>
          array(3) {
            [0]=>
            string(22) "1900.10 à 1905.10 MHz"
            [1]=>
            string(22) "1935.30 à 1950.10 MHz"
            [2]=>
            string(22) "2125.30 à 2140.10 MHz"
          }
          ["UMTS 900"]=>
          array(2) {
            [0]=>
            string(20) "880.10 à 889.90 MHz"
            [1]=>
            string(20) "925.10 à 934.90 MHz"
          }
        }
      }
      ["180.00"]=>
      array(1) {
        ["26.00"]=>
        array(5) {
          ["GSM 1800"]=>
          array(2) {
            [0]=>
            string(22) "1758.30 à 1784.90 MHz"
            [1]=>
            string(22) "1853.30 à 1879.90 MHz"
          }
          ["GSM 900"]=>
          array(2) {
            [0]=>
            string(20) "880.10 à 889.90 MHz"
            [1]=>
            string(20) "925.10 à 934.90 MHz"
          }
          ["LTE 1800"]=>
          array(2) {
            [0]=>
            string(22) "1765.00 à 1785.00 MHz"
            [1]=>
            string(22) "1860.00 à 1880.00 MHz"
          }
          ["UMTS 2100"]=>
          array(3) {
            [0]=>
            string(22) "1900.10 à 1905.10 MHz"
            [1]=>
            string(22) "1935.30 à 1950.10 MHz"
            [2]=>
            string(22) "2125.30 à 2140.10 MHz"
          }
          ["UMTS 900"]=>
          array(2) {
            [0]=>
            string(20) "880.10 à 889.90 MHz"
            [1]=>
            string(20) "925.10 à 934.90 MHz"
          }
        }
      }
      ["280.00"]=>
      array(1) {
        ["26.00"]=>
        array(5) {
          ["GSM 1800"]=>
          array(2) {
            [0]=>
            string(22) "1758.30 à 1784.90 MHz"
            [1]=>
            string(22) "1853.30 à 1879.90 MHz"
          }
          ["GSM 900"]=>
          array(2) {
            [0]=>
            string(20) "880.10 à 889.90 MHz"
            [1]=>
            string(20) "925.10 à 934.90 MHz"
          }
          ["LTE 1800"]=>
          array(2) {
            [0]=>
            string(22) "1765.00 à 1785.00 MHz"
            [1]=>
            string(22) "1860.00 à 1880.00 MHz"
          }
          ["UMTS 2100"]=>
          array(3) {
            [0]=>
            string(22) "1900.10 à 1905.10 MHz"
            [1]=>
            string(22) "1935.30 à 1950.10 MHz"
            [2]=>
            string(22) "2125.30 à 2140.10 MHz"
          }
          ["UMTS 900"]=>
          array(2) {
            [0]=>
            string(20) "880.10 à 889.90 MHz"
            [1]=>
            string(20) "925.10 à 934.90 MHz"
          }
        }
      }
    }
  }
  ["ORANGE"]=>
  array(4) {
    ["number"]=>
    string(6) "320884"
    ["date_ok"]=>
    string(10) "11/07/2003"
    ["date_ok_edit"]=>
    string(10) "06/07/2007"
    ["azimuth"]=>
    array(3) {
      ["0.00"]=>
      array(1) {
        ["23.00"]=>
        array(3) {
          ["GSM 1800"]=>
          array(2) {
            [0]=>
            string(22) "1713.10 à 1736.90 MHz"
            [1]=>
            string(22) "1808.10 à 1831.90 MHz"
          }
          ["GSM 900"]=>
          array(2) {
            [0]=>
            string(20) "890.10 à 902.50 MHz"
            [1]=>
            string(20) "935.10 à 947.50 MHz"
          }
          ["UMTS 2100"]=>
          array(3) {
            [0]=>
            string(22) "1910.10 à 1915.10 MHz"
            [1]=>
            string(22) "1964.90 à 1979.70 MHz"
            [2]=>
            string(22) "2154.90 à 2169.70 MHz"
          }
        }
      }
      ["120.00"]=>
      array(1) {
        ["23.00"]=>
        array(3) {
          ["GSM 1800"]=>
          array(2) {
            [0]=>
            string(22) "1713.10 à 1736.90 MHz"
            [1]=>
            string(22) "1808.10 à 1831.90 MHz"
          }
          ["GSM 900"]=>
          array(2) {
            [0]=>
            string(20) "890.10 à 902.50 MHz"
            [1]=>
            string(20) "935.10 à 947.50 MHz"
          }
          ["UMTS 2100"]=>
          array(3) {
            [0]=>
            string(22) "1910.10 à 1915.10 MHz"
            [1]=>
            string(22) "1964.90 à 1979.70 MHz"
            [2]=>
            string(22) "2154.90 à 2169.70 MHz"
          }
        }
      }
      ["240.00"]=>
      array(1) {
        ["23.00"]=>
        array(3) {
          ["GSM 1800"]=>
          array(2) {
            [0]=>
            string(22) "1713.10 à 1736.90 MHz"
            [1]=>
            string(22) "1808.10 à 1831.90 MHz"
          }
          ["GSM 900"]=>
          array(2) {
            [0]=>
            string(20) "890.10 à 902.50 MHz"
            [1]=>
            string(20) "935.10 à 947.50 MHz"
          }
          ["UMTS 2100"]=>
          array(3) {
            [0]=>
            string(22) "1910.10 à 1915.10 MHz"
            [1]=>
            string(22) "1964.90 à 1979.70 MHz"
            [2]=>
            string(22) "2154.90 à 2169.70 MHz"
          }
        }
      }
    }
  }
  ["SFR"]=>
  &array(4) {
    ["number"]=>
    string(6) "453640"
    ["date_ok"]=>
    string(10) "25/05/2007"
    ["date_ok_edit"]=>
    string(10) "23/04/2010"
    ["azimuth"]=>
    array(3) {
      ["165.00"]=>
      array(1) {
        ["25.00"]=>
        array(2) {
          ["GSM 1800"]=>
          array(2) {
            [0]=>
            string(22) "1710.00 à 1785.00 MHz"
            [1]=>
            string(22) "1805.00 à 1880.00 MHz"
          }
          ["UMTS 2100"]=>
          array(3) {
            [0]=>
            string(22) "1915.10 à 1920.10 MHz"
            [1]=>
            string(22) "1920.50 à 1935.30 MHz"
            [2]=>
            string(22) "2110.50 à 2125.30 MHz"
          }
        }
      }
      ["243.20"]=>
      array(1) {
        ["27.60"]=>
        array(1) {
          ["FH"]=>
          array(1) {
            [0]=>
            string(18) "37.26 à 37.50 GHz"
          }
        }
      }
      ["280.00"]=>
      &array(1) {
        ["25.00"]=>
        &array(2) {
          ["GSM 1800"]=>
          array(2) {
            [0]=>
            string(22) "1710.00 à 1785.00 MHz"
            [1]=>
            string(22) "1805.00 à 1880.00 MHz"
          }
          ["UMTS 2100"]=>
          array(3) {
            [0]=>
            string(22) "1915.10 à 1920.10 MHz"
            [1]=>
            string(22) "1920.50 à 1935.30 MHz"
            [2]=>
            string(22) "2110.50 à 2125.30 MHz"
          }
        }
      }
    }
  }
}

现在,此函数计算(移动)运营商需要多少行。

function nbRowsForCarrier($carrier){
    global $table;

    $nb_lines = 0;

    foreach( $table[$carrier]['azimuth'] as $azimuth => $heights ){
        foreach( $heights as $height => $systems ){
            foreach( $systems as $system ){
                $nb_lines += count($system); 
            }
        }
    }   

    return $nb_lines;
}

因此,如果我调用nbRowsForCarrier(“ SFR”),它将返回11。(因为SFR的频率范围为11),问题是当从foreach调用该结果时,该结果会发生变化:

foreach( $table as $carrier => $details ){
    echo nbRowsForCarrier($carrier); // When $carrier="SFR", it returns 13 instead of 11.
    [...Other operations...]
}

对于其他运营商“ BOUYGUES TELECOM”和“ ORANGE”,它可以正常运行。 但这不适用于“ SFR”。 我高度怀疑引用是问题所在(请注意,在var_dump中,SFR数组中“数组”之前有一些“&”)可能是游标的问题...我尝试使用reset()进行操作,但未成功。 ..

有没有办法将此数组复制到另一个变量而不引用(我认为这会引起问题)?

谢谢您的帮助

实际上,如果引用了“ SFR”数组(“ array”之前的“&”),那是因为我做了一个ksort()来按字母顺序对键进行排序。 为了删除“数组”之前的“&”,然后使它工作,我看到了这一点: PHP foreach通过引用在遍历对象数组时会引起奇怪的故障

就我而言,当我必须按系统排序时,我必须这样做:

// Sort by system
foreach( $table as $carrier => &$info_carrier ){
    foreach( $info_carrier['azimuth'] as &$heights ){
        foreach( $heights as $height => &$systems ){
            ksort($systems);
        }
        unset($systems); // WHAT I ADDED TO GET IT WORKING
    }
    unset($heights); // WHAT I ADDED TO GET IT WORKING
}
unset($info_carrier); // WHAT I ADDED TO GET IT WORKING

然后它起作用了!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM