将平面关联数组的连字符键拆分为二维关联数组的第一级和第二级键

问题描述 投票:0回答:4

我需要将一维数组转换为二维数组。 原始键是用连字符连接的。新数组应使用连字符之前的数字作为新的第一级键,使用连字符之后的字符串作为第二级键。

输入:

Array
(
    [71-ctns] => 1
    [71-units] => 1
    [308-units] => 1
    [305-ctns] => 1
    [306-units] => 2
)

所需输出:

Array
(
    [71] => Array
        (
            [ctns] => 1
            [units] => 1
        )
    [308] => Array
        (
            [units] => 1
        )

    [305] => Array
        (
            [ctns] => 1
        )
    [306] => Array
        (
            [units] => 2
        )
)

这可能吗?

php arrays multidimensional-array grouping data-conversion
4个回答
2
投票

这样应该可以了

$merged = array();
foreach($a as $k=>$v){
    $t = explode('-',$k);
    $id = intval($t[0]);
    if(!array_key_exists($id, $merged))
        $merged[$id] = array();
    $merged[$id][$t[1]] = $v;
}

编辑:

抱歉,你应该使用explode而不是split。


1
投票

是的,但需要循环(注意:array_map也可以工作,但这个例子更明确):

$fin = array();
foreach( $complex as $item => $val ) 
{
    $pieces = explode('-', $item);
    $fin[$pieces[0]] = isset($fin[$pieces[0]])?:array();
    $fin[$pieces[0]][$pieces[1]] = $val;
}

1
投票

找到下面的代码来重构预定义的 php 数组

<?php
$newArray=array();
$result = array("71-ctns"=>1,"71-units"=>1,"308-ctns"=>1,"308-units"=>1,"305-units"=>1,"306-units"=>2);
if(is_array($result) && count($result)>0) {
    foreach($result as $key=>$val) {
        $getKeyArray = explode("-",$key);
        $newArray[$getKeyArray[0]][$getKeyArray[1]] =$val;      
    }
}
print"<pre>";
print_r($newArray);
?>

0
投票

使用方括号语法推送子元素时,无需声明空父数组。

为了提高可读性,请使用带有分解密钥字符串的对称数组解构。

PHP 会自动神奇地将数字字符串键转换为整数类型。

代码:(演示

$array = [
    '71-ctns' => 1,
    '71-units' => 1,
    '308-units' => 1,
    '305-ctns' => 1,
    '306-units' => 2,
];

$result = [];
foreach ($array as $k => $v) {
    [$id, $label] = explode('-', $k);
    $result[$id][$label] = $v;
}
var_export($result);

输出:

array (
  71 => 
  array (
    'ctns' => 1,
    'units' => 1,
  ),
  308 => 
  array (
    'units' => 1,
  ),
  305 => 
  array (
    'ctns' => 1,
  ),
  306 => 
  array (
    'units' => 2,
  ),
)
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.