需要从一个大数组创建子数组

时间:2012-11-12 23:40:40

标签: php arrays multidimensional-array

请帮我解决一个我真的陷入PHP的问题

我有一个大阵列

$a = array(
    'foo_1' => 'Dog',
    'bar_1' => 'Cat',
    'baz_1' => 'Fish',
    'foo_2' => 'Frog',
    'bar_2' => 'Bug',
    'baz_2' => 'Ddd',
    ...
);

它需要在多个数组中进行转换:

$a_1 = array(
    'foo' => 'Dog',
    'bar' => 'Cat',
    'baz' => 'Fish'
);  

$a_2 = array(
    'foo' => 'Frog',
    'bar' => 'Bug',
    'baz' => 'Ddd'
);

你注意到有一个小逻辑。大数组应按键组分割(_1,_2,_3; _1,_2,_33)

希望我足够清楚!

由于

4 个答案:

答案 0 :(得分:2)

假设密钥总是重复每个 3 项目的订购,array_chunk将起作用:

$newArray = array_chunk($a, 3);

答案 1 :(得分:1)

假设$a具有此结构(因为OP原始数组具有重复键):

$a = array(
'foo_1' => 'Dog',
'bar_1' => 'Cat',
'baz_1' => 'Fish',
'foo_2' => 'Frog',
'bar_2' => 'Bug',
'baz_2' => 'Ddd'
);

您可以通过这种方法转换数组:

$temp = array();
foreach($a as $key=>$val){
    $num = substr(strrchr($key, '_'), 1);
    $nkey = basename($key, '_'.$num);
    $temp[$num][$nkey] = $val;
}
// See what happens
print_r($temp); 

答案 2 :(得分:0)

我确定多维数组更好但是这就是你要求的,在“_”之前具有相同字符串的值将被覆盖(丢失),因此你的逻辑可能存在问题。

$array1 = array();
$array2 = array();
$array3 = array();
$bigArray = array('av_1'=>'dghdfg','ab_2'=>'dgdfg');
foreach($bigArray as $key=>$value)
{
  $splitKey = explode('_',$key);
  $number = $splitKey[1];
  $newKey = $splitKey[0];
  $varName = "array".$number;
  ${$varName}[$newKey] = $value;
}

<强>多维:

    $newBigArray = array();
    $bigArray = array('av_1'=>'dghdfg','ab_2'=>'dgdfg');

    foreach($bigArray as $key=>$value)
    {
      $splitKey = explode('_',$key);
      $newKey = $splitKey[0];
      $number = $splitKey[1];

      if(!isset($newBigArray[$newKey])) {
        $newBigArray[$newKey] = array();
      }
      $newBigArray[$newKey][$number] = $value;
    }
    var_dump($newBigArray);

答案 3 :(得分:0)

获取所有数组条目的键,用下划线字符(_)拆分它们,然后将它们放入数组中。

$a = array(
    'foo_1' => 'Dog',
    'bar_2' => 'Cat',
    'baz_3' => 'Fish',
    'foo_1' => 'Frog',
    'bar_2' => 'Bug',
    'baz_3' => 'Ddd',
    ...
);

$arrays = array(
    'foo' => array(),
    'bar' => array(),
    'baz' => array()
);

foreach ($a as $k => $v) {
    $s = explode("_", $k);
    if (!isset($arrays[$s[0]])) {
        $arrays[$s[0]] = array();
    }
    $arrays[$s[0]][$s[1]] = $v; // This line if you want to preserve the index (1, 2, ...)
    $arrays[$s[0]][] = $v; // Or this line if you want to reindex the arrays.
    // Comment or remove one of these two lines.
}

然后你有一个多维数组:

array(
    'foo' => array(
       "Dog",
       "Frog"
    ),
    'bar' => array(
        "Cat",
        "Bug"
    ),
    'baz' => array(
        "Fish",
        "Ddd"
    ),
    ...
)

我建议您使用上面的多维数组,但是如果您想为每个'key'(如'foo','bar'等等)创建一个新变量,那么请使用以下代码段:

$a = array(
    'foo_1' => 'Dog',
    'bar_2' => 'Cat',
    'baz_3' => 'Fish',
    'foo_1' => 'Frog',
    'bar_2' => 'Bug',
    'baz_3' => 'Ddd',
    ...
);

foreach ($a as $k => $v) {
    $s = explode("_", $k);
    ${$s[0]}[$s[1]] = $v; // This line if you want to preserve the index (1, 2, ...)
    ${$s[0]}[] = $v; // Or this line if you want to reindex the arrays.
    // Comment or remove one of these two lines.
}

请注意,您的数组$a有一些重复的键,这在PHP中是不可能的。
编辑:我看到你解决了。