【问题标题】:Convert 1d array to 2d in php在php中将一维数组转换为二维
【发布时间】:2015-11-27 18:41:33
【问题描述】:

我有一个如下的一维数组:

$arr = [
    'itemName0' => "first Item",
    'itemDesc0' => "first item's description",
    'itemName1' => "second item",
    'itemDesc1' => "third item's description",
];

我想将其转换为二维数组,如下所示

$arr = [
    0 => [
        'itemName' => "first Item",
        'itemDesc' => "first item's description",
    ],
    1 => [
        'itemName' => "second item",
        'itemDesc' => "Second item's description",
    ],
];

实际上,我有来自 api 响应的数据,其中包含除项目之外的其他详细信息.....{index} 例如

$arr = [
    'status' => 'success',
    'blahblah' => 'this is just a test',
    'itemName0' => "first Item",
    'itemDesc0' => "first item's description",
    'itemName1' => "second item",
    'itemDesc1' => "third item's description",
];

但我只需要项目数据。

我尝试使用 array_map 如下获取项目,但无法..

array_map(function($value, $key){ strpos($key, 'item') === false ? false : $value;  }, $arr));

我还在尝试..任何想法都会很有帮助

【问题讨论】:

  • 也发布你的尝试...
  • 你可以使用array_chunk
  • 使用foreach然后创建你的新数组!
  • 我刚刚添加了一些更新。
  • @Andrew - items 数组可以包含更多数据,例如 item1 有名称和描述,但 item 2 有名称、描述和价格。

标签: php arrays multidimensional-array associative-array


【解决方案1】:

你可以试试这个——

$arr = [
    'itemName0' => "first Item",
    'itemDesc0' => "first item's description",
    'itemName1' => "second item",
    'itemName2' => "second item's description",
];

$new = [];
foreach($arr as $key => $value) {
   $index = sscanf($key, '%[A-Za-z]%d');
   if(strpos($key, 'item') === 0) {
      $new[$index[1]][$index[0]] = $value;
   }
}

输出

array(3) {
  [0]=>
  array(2) {
    ["itemName"]=>
    string(10) "first Item"
    ["itemDesc"]=>
    string(24) "first item's description"
  }
  [1]=>
  array(1) {
    ["itemName"]=>
    string(11) "second item"
  }
  [2]=>
  array(1) {
    ["itemName"]=>
    string(25) "second item's description"
  }
}

【讨论】:

  • 我无法通过此方法,因为我的数组将包含除我的项目详细信息之外的其他详细信息,请参阅更新后的帖子。使用正确的 '/"s. 是什么意思??
  • @Svengali,编辑已在稍后添加。检查更新的答案。
  • @user2707590 检查更新的答案。作者's 已修复。
  • 如果密钥是newitem怎么办?如果密钥是itemName33 怎么办?
【解决方案2】:

使用Array Chunk方法是最简单的

$input_array = array('a', 'b', 'c', 'd', 'e','f');
print_r(array_chunk($input_array, 2));  

输出:

Array
(
 [0] => Array
    (
        [0] => a
        [1] => b
    )

 [1] => Array
    (
        [0] => c
        [1] => d
    )

 [2] => Array
    (
        [0] => e
        [1] => f
    ) 
)

【讨论】:

    【解决方案3】:

    首先,创建一个空的多维数组:
    $multi_arr = array();

    然后,遍历原始数组,

    foreach($arr as $key => $val) { <br/>
        //get last character from key<br/>
        $k = substr($key, -1);<br/>
        //get key index value from original key by removing last character<br/>
        $index = rtrim($key, $k);<br/>
        //Push values to multi dimensional array<br/>
        $multi_arr[$k][$index] = $val;<br/>
    }
    

    【讨论】:

      【解决方案4】:
      $arr = [
          'itemName0' => "first Item",
          'itemDesc0' => "first item's description",
          'itemName1' => "second item",
          'itemName2' => "third item's description",
          'testKey1' => "Should be ignored",
          'itemData' => "No numeric, so should also be ignored"
      ];
      
      $newArray = [];
      foreach($arr as $key => $value) {
          list($keyName, $keyNumber) = sscanf($key, 'item%[A-Za-z]%d');
          if (!is_null($keyNumber)) {
              $newArray[$keyNumber]['item'.$keyName] = $value;
          }
      }
      
      var_dump($newArray);
      

      Demo

      【讨论】:

      • 否.. 再次检查问题。
      • OK,所以它还需要测试密钥的前 4 个字符 - ideone.com/Somnqo
      【解决方案5】:

      我能做的最简单的是,

      $process = array_filter($arr, function($key){
                     return (strpos($key, 'itemName') !== false && ctype_digit(substr($key, 8)))
                            || 
                            (strpos($key, 'itemDesc') !== false && ctype_digit(substr($key, 8)));
                 }, ARRAY_FILTER_USE_KEY);
      
      $final = [];
      
      foreach ($process as $key => $value)
      {
          $final[substr($key, 8)][substr($key, 0, 8)] = $value;
      }
      

      【讨论】:

        【解决方案6】:

        现在回答可能为时已晚,但我已经创建了一个函数,可以根据需要将数组拆分为组。

        function SplitInto($array, $groups = 2)
        {
           $members = count($array) / $groups;
           if (count($array) % $groups) $members = (int)(count($array) / $groups) + 1;
           return array_chunk($array, $members);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-03-26
          • 2016-02-18
          • 2018-02-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多