【问题标题】:php changing the keys of a multi-dimensional arrayphp更改多维数组的键
【发布时间】:2017-09-20 09:08:14
【问题描述】:

我的代码通过了 $_FILES 数组并取消了一些文件的设置。该数组现在具有不以 0 开头并且也乱序的键。

[userfile] => Array
    (
        [name] => Array
            (
                [2] => IMG_20170325_124043610_HDR.jpg
                [3] => video_icon.png
                [5] => watersports.gif
                [7] => IMG_20170325_153726906_HDR.jpg
            )

我想从零开始依次重命名键,如下所示:

[userfile] => Array
    (
        [name] => Array
            (
                [0] => IMG_20170325_124043610_HDR.jpg
                [1] => video_icon.png
                [2] => watersports.gif
                [3] => IMG_20170325_153726906_HDR.jpg
            )

我不想更改 [userfile] [name] 或任何其他非数字键的键值。有这个功能吗?我想按照这些思路做一些事情:

// FILE COUNT IS PROVIDED BY CODE ABOVE

// Is $num equal to $fileCount? 
$num = 0;

// Change the value of the key through iteration
while ($num < $fileCount) {
   // need a built in function that allows the key change
   **reset_key**($_FILES['userfile']['name'][$num]);
   **reset_key**($_FILES['userfile']['type'][$num]);
   **reset_key**($_FILES['userfile']['tmp_name'][$num]);
   **reset_key**($_FILES['userfile']['error'][$num]);
   **reset_key**($_FILES['userfile']['size'][$num]);
}
$num++;

这甚至是正确的方法,还是我应该在这里尝试其他方法?非常感谢您的意见!

干杯,

沙克尔顿

【问题讨论】:

标签: php arrays


【解决方案1】:

无需重置您的密钥。您可以使用简单的 key =&gt; value foreach 迭代您的 $_FILES 数据,并从其他子数组中获取具有相同 key 的值:

foreach ($_FILES['userfile']['name'] as $key => $value) {
    echo 'Name: ', $value;
    echo 'Tmp_name: ',$_FILES['userfile']['tmp_name'][$key];
    echo 'Size: ', $_FILES['userfile']['size'][$key];
}

如果您仍想重置子数组的键,请使用array_values,但要注意 - 您需要重置 $_FILES['userfile'] 的所有子数组中的值:nametmp_nameerror、@ 987654330@, type.

【讨论】:

    【解决方案2】:

    使用array_values()

    代码:

    <?php
    
    $file= array(
    
                $arr1 = array
                (
                    23 => 'IMG_20170325_124043610_HDR.jpg',
                    4 => 'video_icon.png',
                    55 => 'watersports.gif',
                    7 => 'IMG_20170325_153726906_HDR.jpg'
                ),
    
          $arr2 = array
                (
                    23 => 'IMG_20170325_124043610_HDR.jpg',
                    43 => 'video_icon.png',
                    54 => 'watersports.gif',
                    7 => 'IMG_20170325_153726906_HDR.jpg'
                )
    
                );
    
    
    for ($i=0; $i<count($file); $i++){
    
        $arr=$file[$i];
        $arr= array_values($arr);
        sort($arr);
    
        foreach ($arr as $key => $val) {
           echo "$key = $val\n";
        } 
      }
    
    ?>
    

    【讨论】:

      【解决方案3】:

      array_walk()array_values() 单线救援:

      array_walk($FILES,function(&$v){$v["userfile"]["name"]=array_values($v["userfile"]["name"]);});
      

      array_walk()击穿:

      array_walk(
          // changed $_FILES to $FILES for testing only
          $FILES, // this is the input array to iterate
          function(&$v){  // $v is each 1st level subarray in $FILES
              //   ^--  & means alter each original subarray from $FILES
              $v["userfile"]["name"]=  // only redeclare/overwrite the subarray's subarray called "name"
                  array_values($v["userfile"]["name"]);  // create a new array with zero-indexed keys and the same values as the original subarray's subarray
          }
      );
      

      如果你使用这个数组作为输入:

      $FILES=array(
          array(
              "userfile" => array(
                  "name" => array(
                      2 => "IMG_20170325_124043610_HDR.jpg",
                      3 => "video_icon.png",
                      5 => "watersports.gif",
                      7 => "IMG_20170325_153726906_HDR.jpg"
                  )
              )
          ),
          array(
              "userfile" => array(
                  "name" => array(
                      9 => "IMG_20170325_124043610_HDR.jpg",
                      13 => "video_icon.png",
                      55 => "watersports.gif",
                      97 => "IMG_20170325_153726906_HDR.jpg"
                  )
              )
          ),
          array(
              "userfile" => array(
                  "name" => array(
                      1 => "IMG_20170325_124043610_HDR.jpg",
                      88 => "video_icon.png",
                      7 => "watersports.gif",
                      10 => "IMG_20170325_153726906_HDR.jpg"
                  )
              )
          )
      );
      

      array_walk()之后,var_export($FILES);会输出:

      array (
        0 => 
        array (
          'userfile' => 
          array (
            'name' => 
            array (
              0 => 'IMG_20170325_124043610_HDR.jpg',
              1 => 'video_icon.png',
              2 => 'watersports.gif',
              3 => 'IMG_20170325_153726906_HDR.jpg',
            ),
          ),
        ),
        1 => 
        array (
          'userfile' => 
          array (
            'name' => 
            array (
              0 => 'IMG_20170325_124043610_HDR.jpg',
              1 => 'video_icon.png',
              2 => 'watersports.gif',
              3 => 'IMG_20170325_153726906_HDR.jpg',
            ),
          ),
        ),
        2 => 
        array (
          'userfile' => 
          array (
            'name' => 
            array (
              0 => 'IMG_20170325_124043610_HDR.jpg',
              1 => 'video_icon.png',
              2 => 'watersports.gif',
              3 => 'IMG_20170325_153726906_HDR.jpg',
            ),
          ),
        ),
      )
      

      【讨论】:

      • 您好 Mickmackusa,非常感谢您的意见。我知道还有其他方法可以处理这个问题,我试图弄清楚 PHP 引擎将如何使用不同的方法运行。我花了几天的时间进行实验,做我能想到的一切,并测试以查看结果。我知道我会使用很多数组和数组函数——我们在课堂上几乎没有做过这些。看到它是如何工作的让我很惊讶。我将能够在许多项目中使用这种方法。我永远无法凭直觉知道这种单线救援。再次感谢!干杯,瑞克
      • @shackleton 我添加了array_walk() 的细分以帮助解释它是如何工作的——希望这能让我的答案对你和其他 SO 读者更清楚。
      猜你喜欢
      • 2016-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-20
      • 1970-01-01
      • 2021-11-28
      • 2014-04-17
      • 1970-01-01
      相关资源
      最近更新 更多