代码之家  ›  专栏  ›  技术社区  ›  James Pavett

迭代生成不需要的输出的数组数组

php
  •  -1
  • James Pavett  · 技术社区  · 6 年前

    在PHP中迭代数组时遇到问题。

    我有以下数组,这些数组是我使用Ajax发布到页面上的。

    Array ( 
    [0] => Array ( [0] => T64 [1] => Array ( [name] => T64 [dummyA] => 2 [dummyB] 
    => 2 [dummyC] => 2 ) ) 
    [1] => Array ( [0] => T65 [1] => Array ( [name] => T65 [dummyA] => 2 [dummyB] 
    => 2 [dummyC] => 2 ) ) 
    [2] => Array ( [0] => T91 [1] => Array ( [name] => T91 [dummyA] => 2 [dummyB] 
    => 2 [dummyC] => 2 ) ) )
    

    我尝试使用下面的方法打印所有内部值,但是它总是在每个期望值之前打印一个t(在它自己的行上)。

    foreach($sOptions as $row => $innerArray){
      foreach($innerArray as $innerRow => $value){
        print $value['dummyA'] . "<br/>";
        print $value['dummyB'] . "<br/>";
        print $value['dummyC'] . "<br/>";
      }
    }
    

    输出:

    T
    T
    T



    T
    T
    T



    T
    T
    T



    是否有人能够给出这些t值的来源?

    3 回复  |  直到 6 年前
        1
  •  3
  •   ino    6 年前

    这是显而易见的。您试图使用不存在的字符串索引从二级数组中获取实际值的索引值。

    因为任何 string can be accessed as an array 然后,不存在的字符串索引被解释为假,因此它返回第一个值,即从作为数组访问的字符串中返回零索引字符。

    在第一种情况下,值t64实际作为数组(“t”、“6”、“1”)访问,因此它返回 T .

    <?php
    
    // simple example
    // Get the first character of a string
    $str = 'T64';
    echo "First character is: ". $str[0] .PHP_EOL;
    echo "Second character is: ". $str[1] .PHP_EOL;
    echo "Third character is: ". $str[2] .PHP_EOL;
    
    echo PHP_EOL;
    
    echo "Applied to your code:". PHP_EOL;
    $sOptions = Array ( Array ( 'T64' ) );
    
    print_r($sOptions[0][0]['invalid string index']);
    

    看看演示: https://eval.in/1063420

    输出:

    First character is: T
    Second character is: 6
    Third character is: 4
    
    
    T
    

    注意:打开错误报告以简化调试;) How do I get PHP errors to display?

    有关将字符串作为数组访问的更多信息,请参见 PHP manual Strings E特殊示例11及更高版本。

        2
  •  3
  •   David Marabottini    6 年前

    你能试着只用一个前臂吗?我没有尝试过这个解决方案,但你可以尝试做类似的事情

    foreach($sOptions as $row => $innerArray){
        $value = $innerArray[1]
        print $value['dummyA'] . "<br/>";
        print $value['dummyB'] . "<br/>";
        print $value['dummyC'] . "<br/>";
    }
    
        3
  •  0
  •   Andreas    6 年前

    也可以使用数组列隔离要迭代的部分。

    foreach(array_column($arr,1) as $row => $value){
        echo $value['dummyA'] . "\n";
        echo $value['dummyB'] . "\n";
        echo $value['dummyC'] . "\n";
    }
    

    这意味着代码将只迭代以下内容:

    array(3) {
      [0]=>
      array(4) {
        ["name"]=>
        string(4) "T64 "
        ["dummyA"]=>
        string(2) "2 "
        ["dummyB"]=>
        string(2) "2 "
        ["dummyC"]=>
        string(2) "2 "
      }
      [1]=>
      array(4) {
        ["name"]=>
        string(3) "T65"
        ["dummyA"]=>
        string(2) "2 "
        ["dummyB"]=>
        string(2) "2 "
        ["dummyC"]=>
        string(1) "2"
      }
      [2]=>
      array(4) {
        ["name"]=>
        string(4) "T91 "
        ["dummyA"]=>
        string(2) "2 "
        ["dummyB"]=>
        string(2) "2 "
        ["dummyC"]=>
        string(2) "2 "
      }
    }
    

    https://3v4l.org/YA6Vq