4

JSON データを返す Web サービスを使用しています。PHP のjson_decode関数でデコードすると、次のような配列が得られます。

Array
(
 [0] => eBook
 [1] => 27
 [2] => Trade Paperback
 [3] => 24
 [4] => Hardcover
 [5] => 4
)

この配列を取り、他のすべての要素がキーであり、次の要素がその値である連想配列に結合する PHP 関数はありますか? 私が思いつきたいのは、次のとおりです。

Array
(
 [eBook] => 27
 [Trade Paperback] => 24
 [Hardcover] => 4
)
4

5 に答える 5

5

私の知る限り、これを行う組み込み関数はありませんが、次のような関数を使用できます。

function combineLinearArray( $arrayToSmush, $evenItemIsKey = true ) {
    if ( ( count($arrayToSmush) % 2 ) !== 0 ) {
        throw new Exception( "This array cannot be combined because it has an odd number of values" );
    }

    $evens = $odds = array();

    // Separate even and odd values
    for ($i = 0, $c = count($arrayToSmush); $i < $c; $i += 2) {
        $evens[] = $arrayToSmush[$i];
        $odds[] = $arrayToSmush[$i+1];
    }

    // Combine them and return
    return ( $evenItemIsKey ) ? array_combine($evens, $odds) : array_combine($odds, $evens);
}

連想配列に結合したい配列と、偶数または奇数の要素をキーとして使用するかどうかを示すオプションのフラグを使用して呼び出すことができます。

編集:偶数と奇数の値を抽出するために個別のループではなく、for ループを 1 つだけ使用するようにコードを変更しました。

于 2012-06-29T15:32:12.160 に答える
4

あなた自身のソリューションは確かにより明確ですが、PHP 関数のみで作成されたこのワンライナーは同じ仕事をします:

$output = call_user_func_array('array_combine', call_user_func_array('array_map', array_merge(array(null), array_chunk($input, 2))));

あなたの質問は「PHP関数はありますか...」でした。答えはノーですが、それらの組み合わせについてはイエスです。

ここで注意が必要な部分は、チャンク配列の転置です。これは、最初の引数としてarray_mapwithを呼び出すことによって実現されます ( 「この関数の興味深い使い方...」と書かれているマニュアルを参照してください)。null

于 2012-06-29T15:58:03.577 に答える
1

次のようなループが機能します。

$array = json_decode(....);

$received = array();
for ($i = 0; $i < count($array); $i++) {
    $received[$array[$i]] = $array[$i+1];
    $i++;
}

var_dump($received);
于 2012-06-29T15:43:27.797 に答える
1

他の回答のコードへの調整:

function combineLinearArray( $arrayToSmush) {

if ( ( count($arrayToSmush) % 2 ) !== 0 ) {
    throw new Exception( "This array cannot be combined because it has an odd number of values" );
}

$combined = array();
for ($i = 0, $i<count($arrayToSmush); $i++) {
    $combined[$arrayToSmush[$i]] = $arrayToSmush[$i+1];
    $i++; // next key
}

// Combine them and return
return $combined;
}
于 2012-06-29T15:45:35.190 に答える