0

だから..私は、phpページに渡されたjqueryからserializeArray()によって生成されたこの配列を持っています..、

これは、PHP の $data に保存した出力配列です。

Array
(
    [0] => Array
        (
            [name] => name
            [value] => sample text
        )

    [1] => Array
        (
            [name] => bdate
            [value] => sample date
        )

    [2] => Array
        (
            [name] => addr
            [value] => sample addr
        )

    [3] => Array
        (
            [name] => demo_des
            [value] => A
        )

    [4] => Array
        (
            [name] => demo_des
            [value] => B
        )
    [5] => Array
        (
            [name] => demo_des
            [value] => C
        )
)

そして、これは id が行うことです:

for($i=0;$i<count($data);$i++){ //loop in $data
    if($data[$i][name]==$data[$i+1][name]||$data[$i][name]==$data[$i-1][name]){
        $impldval[] .= $data[$i][value];
        $impldkey[] .= $data[$i][name];
    }else{
        $arr[$data[$i][name]] .= $data[$i][value];
    }
}

基本的に、データをループして、data[num][name] が次または前と等しいかどうかを確認し、そうであれば配列に格納し、そうでない場合は別の配列に格納します。

次に、次のように重複した値を内破します。

if(is_array($impldkey)&is_array($impldval)){$arr[$impldkey[0]] .= implode(',',$impldval);}

$arr を出力すると、次のようになります。

Array
(
    [name] => sample text
    [bdate] => sample date
    [addr] => sample addr
    [demo_des] => A,B,C
)

これは正しいですが、問題は、同じ名前の配列が順序どおりでない場合、チェックするインクリメントが機能しないことです。

Array
(
    [0] => Array
        (
            [name] => name
            [value] => sample text
        )

    [1] => Array
        (
            [name] => demo_des
            [value] => A
        )

    [2] => Array
        (
            [name] => addr
            [value] => sample addr
        )

    [3] => Array
        (
            [name] => demo_des
            [value] => B
        )

    [4] => Array
        (
            [name] => bdate
            [value] => sample date
        )
    [5] => Array
        (
            [name] => demo_des
            [value] => C
        )
)

内破も機能しないため、これは次のようになります。

Array
(
    [name] => sample text
    [bdate] => sample date
    [addr] => sample addr
    [demo_des] => ABC
)

これが以前に尋ねられた場合は申し訳ありませんが、検索すると、マージする2つ以上の配列だけが求められます..

助言がありますか?または、これを回避する他の作業...

編集:これが私がする必要があることです。多次元配列を serializeArray() から単一の配列に変換し、重複した名前を結合して値を内破する必要があります。上記の例のように、配列をループして追加します「$arr」に追加しますが、重複している場合は別の配列に保存してから内破して「$arr」に追加します。

4

3 に答える 3

0
$arrayDefaults = array(
    'a' => '1',
    'b' => '10',
    'c' => '10',
    'd' => '10',
    'e' => '10',
);

$arrayPost = array(
    array('name' =>'a', 'value'=>'1'),
    array('name' =>'b', 'value'=>'2'),
    array('name' =>'c', 'value'=>'3'),
    array('name' =>'d', 'value'=>'4'),
    array('name' =>'e', 'value'=>'5'),
    array('name' =>'f', 'value'=>'6')
);

$arrayNew = array();
foreach($arrayPost as $v){
    if(isset($v['name'], $v['value'])){
        //don't forget to sanitize values
        $value = filter_var($v['value'], FILTER_SANITIZE_SPECIAL_CHARS);
        if(isset($arrayNew[$v['name']])){
            $arrayNew[$v['name']] .= ',' . $value;
        }else{
            $arrayNew[$v['name']] = $value;
        }
    }
}

//remove unknown keys
$arrayMatchKeys = array_intersect_key($arrayNew, $arrayDefaults);

//get only changed fields
$arrayUpdate = array_diff_assoc($arrayMatchKeys, $arrayDefaults);

結果:

array (size=4)
  'b' => string '2' (length=1)
  'c' => string '3' (length=1)
  'd' => string '4' (length=1)
  'e' => string '5' (length=1)
于 2013-06-19T11:02:00.880 に答える
0
$data =array (array('name'=>'name','value'=>'sample text'),array('name'=>'bdate','value'=>'sample date'),array('name'=>'addr','value'=>'sample addr'),array('name'=>'demo_des','value'=>'A'),array('name'=>'demo_des','value'=>'B'),array('name'=>'demo_des','value'=>'C')   );

foreach ($data as $k=>$v){

    $name=$v['name'];
    $value=$v['value'];

    if($out_put_array["$name"])
    { 
       $out_put_array["$name"].=','.$value;
    }
    else
    {
       $out_put_array["$name"]=$value;
    }

    }

print_r($out_put_array);
Array ( [name] => sample text [bdate] => sample date [addr] => sample addr [demo_des] => A,B,C )
于 2013-06-19T11:45:37.560 に答える