如何将平面PHP数组转换为索引数组

时间:2017-10-16 08:10:49

标签: php arrays

我有以下数组:

rdd2

我如何转换成这样的结构?

'values' => [
        'protein_question_0_typing_method' => '38'
        'protein_question_0_amount_1' => '1'
        'protein_question_0_amount_2' => '2'
        'protein_question_0_units_of_measurement' => '17'
        'protein_question_1_typing_method' => '39'
        'protein_question_1_amount_1' => '2'
        'protein_question_1_amount_2' => '2'
        'protein_question_1_units_of_measurement' => '17'
        'protein_question_2_typing_method' => '42'
        'protein_question_2_amount_1' => '2'
        'protein_question_2_amount_2' => '2'
        'protein_question_2_units_of_measurement' => '17'
        'distributionId' => '21'
    ]

这是我尝试过的:

'values' => [
         0 => [
          'protein_question_typing_method' => '38',
          'protein_question_amount_1' => '1',
          'protein_question_amount_2' => '2'
         ],
         1 => [
          'protein_question_typing_method' => '42',
          'protein_question_amount_1' => '1',
          'protein_question_amount_2' => '2'
         ],
         ...

        'distributionId' => '21'
    ]

上面的代码只是打印数据,因为我需要以分块格式提供数据,因为每个块都会被保存为数据库中的新模型记录。

所以基本上只需要将它转换为索引数组,任何人都知道最简单的方法,因为循环第一个数组会很复杂吗?

由于

3 个答案:

答案 0 :(得分:1)

可以做到

$input = [
'values' => [
    'protein_question_0_typing_method' => '38',
        'protein_question_0_amount_1' => '1',
        'protein_question_0_amount_2' => '2',
        'protein_question_0_units_of_measurement' => '17',
        'protein_question_1_typing_method' => '39',
        'protein_question_1_amount_1' => '2',
        'protein_question_1_amount_2' => '2',
        'protein_question_1_units_of_measurement' => '17',
        'protein_question_2_typing_method' => '42',
        'protein_question_2_amount_1' => '2',
        'protein_question_2_amount_2' => '2',
        'protein_question_2_units_of_measurement' => '17',
        'distributionId' => '21'
    ]
];

$output = [];
foreach ($input["values"] as $key => $value) {
    if (preg_match('#^protein_question_(\d+)_(.+)$#', $key, $match)) {
        $output[$match[1]]['protein_question_' . $match[2]] = $value;
    } else {
        $output[$key] = $value;
    }
}
var_dump($output);

这将迭代数组中的所有键,如果以protein_question开头,后跟一个数字,后跟一些文本,则匹配。如果是,则将该数字用作输出中的索引,以保持键减去数字和值。如果它不匹配,则按键和值按原样放置。

会给出

array(4) {
  [0]=>
  array(4) {
    ["protein_question_typing_method"]=>
    string(2) "38"
    ["protein_question_amount_1"]=>
    string(1) "1"
    ["protein_question_amount_2"]=>
    string(1) "2"
    ["protein_question_units_of_measurement"]=>
    string(2) "17"
  }
  [1]=>
  array(4) {
    ["protein_question_typing_method"]=>
    string(2) "39"
    ["protein_question_amount_1"]=>
    string(1) "2"
    ["protein_question_amount_2"]=>
    string(1) "2"
    ["protein_question_units_of_measurement"]=>
    string(2) "17"
  }
  [2]=>
  array(4) {
    ["protein_question_typing_method"]=>
    string(2) "42"
    ["protein_question_amount_1"]=>
    string(1) "2"
    ["protein_question_amount_2"]=>
    string(1) "2"
    ["protein_question_units_of_measurement"]=>
    string(2) "17"
  }
  ["distributionId"]=>
  string(2) "21"
}

答案 1 :(得分:0)

这是一个非常基本的实现,可以根据您的特定需求进行调整:

<?php

$values = [
        'protein_question_0_typing_method' => '38',
        'protein_question_0_amount_1' => '1',
        'protein_question_0_amount_2' => '2',
        'protein_question_0_units_of_measurement' => '17',
        'protein_question_1_typing_method' => '39',
        'protein_question_1_amount_1' => '2',
        'protein_question_1_amount_2' => '2',
        'protein_question_1_units_of_measurement' => '17',
        'protein_question_2_typing_method' => '42',
        'protein_question_2_amount_1' => '2',
        'protein_question_2_amount_2' => '2',
        'protein_question_2_units_of_measurement' => '17',
        'distributionId' => '21'
];

function convert($values) {
    $result = [];

    foreach ($values as $key => $value) {
        $matches = [];
        $ret = preg_match('~^protein_question_([0-9]+)_~U', $key, $matches);

        // Key does not match the pattern protein_question_*_
        if ($ret !== 1) {
            $result[$key] = $value;

            continue;
        }

        $proteinQuestionID = (int)$matches[1];

        // Create key for the this ID
        if (!isset($result[$proteinQuestionID])) {
            $result[$proteinQuestionID] = [];
        }

        // Adjust the key...
        $key = \substr($key, \strlen('protein_question_'.$proteinQuestionID));
        $key = 'protein_question'.$key;

        // Append to it...
        $result[$proteinQuestionID][$key] = $value;
    }

    return $result;
}

print_r(convert($values));

答案 2 :(得分:-1)

你尝试过array_chunk($ your_array,4)。它看起来这种方法可以帮助你