-3

私は次のようなphp配列を持っています:

    Array
    (
       [0] => Array
              (
                [0] => name_first
                [1] => name_second
                [2] => age
              )

       [1] => Array
              (
                [0] => firstname1
                [1] => surname1
                [2] => age1
              )

       [2] => Array
              (
                [0] => firstname2
                [1] => surname2
                [2] => age2
              )
    )

そして、最初の3つの値を使用したいと思います(これらは変更されます)。下線付きの値(この例のname_firstとname_secondなど)がある場合は、配列を次のように再構築します。

    Array
    (
      [0] => Array
             (
               [name] => Array
                         (
                           [first] => firstname1
                           [second] => surname1
                         )
               [age] => age1
             )

      [1] => Array
             (
               [name] => Array
                         (
                           [first] => firstname2
                           [second] => surname2
                         )
               [age] => age2
             )
    )

私はこれに2日間取り組んでいますが、これに対する解決策を思い付くのに苦労しているので、私の質問は次のとおりです。効率的な方法でこれを達成するにはどうすればよいですか?

4

2 に答える 2

1

これはあなたが探しているものですか?

$result[]=array('name'=>array('firstname'=>$firstName,'lastname'=>$lastName),'age'=>$age);

次のような名前と年齢の配列があるとします。

$persons=array(
    [0]=>array('name'=>'Fredrick cheeseton','age'=>'23')
    [1]=>array('name'=>'Bob Scandal','age'=>'102')
    ['random key to show this doesn\'t matter']=array('name'=>'Uncle Jeff','age'=>'1')
);

$result指定したように、これを配列に処理しましょう。

foreach($persons as $person){
    //leaving the array key blank suggests an auto acceding integer.
    $name=explode(" ",$person['name']);//spliting the name into two parts using the ' '(space)
    $result[]=array('name'=>array('firstName'=>$name[0],'lastName'=>$name[1]),'age'=>$person['age']);
}
if(isset($result))?var_dump($result):'Result was never declared';
于 2013-03-10T15:57:19.450 に答える
0

コメントにより回答が更新されました...動作するコードは次のとおりです。

$input = array(
    array(
        "name_first",
        "name_second",
        "age"
    ),
    array(
        "firstname1",
        "surname1",
        "age1"
    ),
    array(
        "firstname2",
        "surname2",
        "age2"
    )
);

function restructure($input) {
  $output = array();
  $a_length = count($input);
  for ($a = 0; $a < $a_length; $a++) { // Loop through child arrays
    $b_length = count($input[$a]);
    for ($b = 0; $b < $b_length; $b++) { // Loop through child array's properties
      if ($a) {
        setValue($output[$a - 1], $input[0][$b], $input[$a][$b]); // See function below
      } else {
        // First child array of $input
        $input[$a][$b] = explode("_", $input[$a][$b]); // Create an array of indexes out of each property.
      }
    }
  }
  return $output;
}

function setValue(&$arr, $indices, $value) { //$arr passed by reference
    $count = count($indices);
    if ($count == 1) { // Check if more than one index (value needs to be nested)
        $arr[$indices[0]] = $value; // Apply value to array
    }
    else {
        $index = array_shift($indices); // Remove first index from array
        if (!is_array($arr[$index])) { // Create an array at this index if it doesn't exist
          $arr[$index] = array();
        }
        setValue($arr[$index], $indices, $value); // Recursively call function passing the current index as reference.
    }
}

print_r(restructure($input));

出力:

Array ( 
  [0] => Array ( 
    [name] => Array ( 
      [first] => firstname1 
      [last] => surname1 
    ) 
    [age] => age1 
  ) 
  [1] => Array ( 
    [name] => Array ( 
      [first] => firstname2 
      [last] => surname2 
    ) 
    [age] => age2 
  ) 
)

最初の子配列をインデックス名のマップとして使用します。値をネストするには、名前にアンダースコアを付けます。例:

array(
  array(
    "one_two_three",
    "hello"
  ),
  array(
    "first val",
    "second val"
  )
)

次の構造を作成します。

Array(
  [0] => Array(
    [one] => Array(
      [two] => Array(
        [three] => "first val"
      )
    )
    [hello] => "second val"
  )
)
于 2013-03-10T16:06:10.290 に答える