1

http_build_query()parse_str()がこの種の問題のより良い解決策であることは知っていますが、作業中の特定のプロジェクトのデータの構造を変更できないため、作成して少し単純化しようとしています。データベースに保存された文字列からの大きな3D連想配列。

この関数を再帰的にするために誰かが私に手を貸してくれませんか?私はそれがこのようなものを取ることを望みます:

explode3D( $separators = array('|',','),
$string = "val1,val2|val1,val2,val3",
$keys = "cat1,item1,item2|cat2,item1,item2,item3"
);

そして、このようなものを返します

Array (
'cat1' => Array('item1'=>'val1', 'item2'=>'val2'),
'cat2' => Array('item1'=>'val1', 'item2'=>'val2', 'item3'=>'val3')
)

これまでの関数は次のとおりです。

function explode3D($separators,$string,$keys=0){
    $res = array();

    if(is_array($separators)){//MULTI DIMENSION MODE: (unfinished!!)

        //help needed here//

    }else{//SINGLE DIMENSION MODE:
        $vals = explode($separators,$string);
        if($keys === 0){ //NO KEYS:
            $res = $vals;
        }else if($keys === 1){//ALTERNATE ROWS ARE KEYS:
            $key = '';
            for($i=0; $i<sizeof($vals); $i++){
                if ($i++ % 2 == 1 ){ //every second element:
                    $key = $vals[$i]; //save the key
                }else{
                    $res[$key] = $vals[$i]; //set the saved key = value
                }
            }
        }else{ //GET KEYS FROM $keys ARRAY:
            if(is_string($keys)){ //explode keys string if necessary (using $separators)
                $keys = explode3D($separators,$keys);
            }
            for($i=0; $i<sizeof($vals); $i++){
                $res[$keys[$i]] = $vals[$i];
            }
        }
    }
    return($res);
}
4

1 に答える 1

0

これがどのように機能するかという考えです。タイプミスや見逃したオペレーターは少ないと思いますが、ハウツーを理解するのに役立つことを願っています。

<?php
$string = "val1,val2|val1,val2,val3";
$keys = "cat1,item1,item2|cat2,item1,item2,item3";

$firstDimension = explode("|", $keys);
$firstDimensionValues = explode("|", $string);
$newArray = Array();
for($i = 0; $i < count($firstDimension); $i++)
{
  $d2Keys = explode(",", $firstDimension[$i]);
  $key = $d2Keys[0];
  array_shift($d2Keys); // remove $key
  $d2Values = explode(",", $firstDimensionValues[$i]);
  for ($a = 0; $a < count($d2Keys); $a++)
  {
    $newArray[$key][$d2Keys[$a]] = $d2Values[$a];
  }
}

print_r($newArray);
于 2012-06-11T14:16:48.080 に答える