1

私はこれらの3つの配列を持っています:

$a1 = array( 'a' => 1, 'b' => 2, 'c' => 3 );
$a2 = array( 'a' => 4, 'b' => 5, 'd' => 6 );
$a3 = array( 'a' => 7, 'c' => 8, 'd' => 9, 'x' => 10 );

結果が次のようになるように、それらをマージしたいと思います。

Array(
[a] => Array(
        [0] => 1
        [1] => 4
        [2] => 7
    )
[b] => Array(
        [0] => 2
        [1] => 5
        [2] => 
    )
[c] => Array(
        [0] => 3
        [1] => 
        [2] => 8
    )
[d] => Array(
        [0] => 
        [1] => 6
        [2] => 9
    )
[x] => Array(
        [0] => 
        [1] => 
        [2] => 10
    )

...そして私はこのような単純なテーブルのデータを使用します:

  col-1 col-2  col-3
a   1     4      7
b   2     5      -
c   3     -      8
d   -     6      9
x   -     -     10

array_merge_recursiveは近いですが、空の要素が表示されないので、ジョブを完了するにはループが必要だと思います。私の問題は、そのループでどの関数を使用する必要があるかを理解することです。

一度に2つの配列をカスタムユーザー関数とマージするだけでよかったと思います。

4

6 に答える 6

5

これに対する最も簡単なアプローチは、すべての入力配列からすべてのキーのリストを取得し、キーのリストを繰り返して結果の配列を作成することだと思います。

$keys = array_unique(
    array_merge(
        array_keys($a1),
        array_keys($a2),
        array_keys($a3)
    )
);

$result = array();
foreach ($keys as $key) {
    $result[$key] = array(
        isset($a1[$key]) ? $a1[$key] : null,
        isset($a2[$key]) ? $a2[$key] : null,
        isset($a3[$key]) ? $a3[$key] : null
    );
}

print_r($result);

それが機能しているのを見る

...または、任意の数の入力配列を持つ配列の配列を提供する場合:

$keys = array();
foreach ($arrs as $arr) {
    $keys = array_merge($keys, array_keys($arr));
}
$keys = array_unique($keys);

$result = array();
foreach ($keys as $key) {
    $result[$key] = array();
    foreach ($arrs as $arr) {
        $result[$key][] = isset($arr[$key]) ? $arr[$key] : null;
    }
}

print_r($result);

それが機能しているのを見る

于 2013-03-25T09:40:11.623 に答える
4

これを試して :

<?php
$a1    = array( 'a' => 1, 'b' => 2, 'c' => 3 );
$a2    = array( 'a' => 4, 'b' => 5, 'd' => 6 );
$a3    = array( 'a' => 7, 'c' => 8, 'd' => 9, 'x' => 10 );

$arr   = array($a1,$a2,$a3);
$cnt   = count($arr);

$res   = array();
foreach($arr as $key=>$val){
   foreach($val as $k=>$v){
     $res[$k][$key]  = $v;
   }
}
echo "<table>";
echo "<tr><td>&nbsp;</td><td>col-1</td><td>col-2</td><td>col-3</td></tr>";
foreach($res as $ky=>$vl){
   echo "<tr>";
   echo "<td>".$ky."</td>";
   for($i=0;$i<$cnt;$i++){
      if(array_key_exists($i,$vl)){
         echo "<td>".$vl[$i]."</td>";
      }
      else{
         echo "<td> - </td>";
      }
   }
   echo "</tr>";
}
echo "</table>";
?>

出力:

    col-1   col-2   col-3
a   1       4       7
b   2       5       -
c   3       -       8
d   -       6       9
x   -       -       10
于 2013-03-25T09:46:50.913 に答える
3

これを試して

<?php
 $a1 = array( 'a' => 1, 'b' => 2, 'c' => 3 );
 $a2 = array( 'a' => 4, 'b' => 5, 'd' => 6 );
$a3 = array( 'a' => 7, 'c' => 8, 'd' => 9, 'x' => 10 );
  function merge_common_keys(){
$arr = func_get_args();
$num = func_num_args();

$keys = array();
$i = 0;
for($i=0;$i<$num;++$i){
    $keys = array_merge($keys, array_keys($arr[$i]));
}
$keys = array_unique($keys);

$merged = array();

foreach($keys as $key){
    $merged[$key] = array();
    for($i=0;$i<$num;++$i){
        $merged[$key][] = isset($arr[$i][$key])?$arr[$i][$key]:null;
    }
}
  return $merged;
  }

$merged = merge_common_keys($a1,$a2,$a3);

print_r($merged);



$table = "<table>";




$table .= "<tr><td></td><td>col1</td><td>col2</td><td>col3</td></tr>";

foreach($merged as  $key=>$value)
  {
    $row = "<tr><td>$key</td>";
     foreach($value as $subvalue)
 {
   $row .= "<td>$subvalue</td>"; 
 }
 $table .= $row;
}
$table .= "</table>";
echo $table;
?>

ref:PHP、配列と共通キーのマージ

ライブデモを参照http://codepad.viper-7.com/v8Ol5H

于 2013-03-25T10:02:42.037 に答える
1

のようなものを作成する必要がありますarray_merge_recursive()

しかし、もっと簡単な解決策があるかもしれません、あなたは言います:

しかし、私に空の要素を与えません、

しかし、あなたはそれらが存在しないことを知っています!

したがって、必要な列の最大数(配列の量)がわかっていて、ループする場合は、いつでも次のことができます。

if(isset($row[$column])) {
   echo $row[$column];//your column
} else {
   echo 0;
}
于 2013-03-25T09:42:27.693 に答える
1
function myMergeFunction() {

  $my_new_array = array();

  $arg_list = func_get_args();
  for ($i = 0; $i < count($arg_list); $i++) {

    foreach($arg_list[$i] as $key => $value) {
      if(!is_array($my_new_array[$key]))
        $my_new_array[$key] = array();

      $my_new_array[$key][] = $value

    }

  }

  return $my_new_array;

}

あなたはそれを次のように呼ぶことができます:

myMergeFunction($a, $b, $c, $d, [...]);
于 2013-03-25T09:43:40.323 に答える
1

→答えが出る前にすでにこれを始めていたので、すでに受け入れられる答えがあったとしても、それを終えることに決めました。ただし、このバージョンはより動的であり、テーブルのスタイルをカスタマイズできます。

コード:

/* Arrays from Question */  $a1 = array( 'a' => 1, 'b' => 2, 'c' => 3 ); $a2 = array( 'a' => 4, 'b' => 5, 'd' => 6 ); $a3 = array( 'a' => 7, 'c' => 8, 'd' => 9, 'x' => 10 );
/* Process Arrays       */  $result = handle_arrays( $a1, $a2, $a3 );
/* Create & Echo Table  */  echo ( array_table( $result ) );

function handle_arrays() {
    /* Get Arrays    */  $params = func_get_args(); $result = array();
    /* Merge Arrays  */  foreach( $params as $k=>$v ) { foreach( $v as $key=>$val ) { if( !array_key_exists( $key, $result ) ) $result[ $key ] = array(); $result[ $key ][ $k ] = $val; } }
    /* Handle Blanks */  for( $x = 0; $x < func_num_args(); $x++ ) { foreach( $result as $key=>$val ) { if( !array_key_exists( $x, $val ) ) { $result[ $key ][ $x ] = '-'; } ksort( $result[ $key ] ); } }
    /* Return Array  */  $return = array( func_num_args(), $result );
    return( $return );
}
function array_table( $array ) {
    /* Array # & Result Array */  $n = $array[ 0 ]; $a = $array[ 1 ];
    /* Style & Class Control  */  $padding_left = 10; $padding_right = 10; $col_align = "center"; $key_align = "left"; $table_class = ""; $col_class = ""; $row_class = ""; $field_class = "";
    /* Table & Column Headers */  $html = "<table class='{$table_class}'><tr><td style='padding-right:{$padding_right}px'></td>"; for( $x=0; $x<$n; $x++ ) { $html .= "<td style='padding-left:{$padding_left}px;padding-right:{$padding_right}px' class='{$col_class}'>col-$x</td>"; } $html .= "</tr>";
    /* Row and Fields Values  */  foreach( $a as $key=>$val ) { $html .= "<tr><td align='{$key_align}' class='{$row_class}'>$key</td>"; foreach( $val as $k=>$v ) { $html .= "<td align='{$col_align}' class='{$field_class}'>$v</td>"; } $html .= "</tr>"; } $html .= "</table>";
    return( $html );
}

出力:

    col-0   col-1   col-2
a     1       4       7
b     2       5       -
c     3       -       8
d     -       6       9
x     -       -       10
于 2013-03-25T11:39:45.030 に答える