0

私は使用しています

foreach ($objs as $obj) {
    $data[] = $obj->getValue;
}

返す可能性のあるメソッドから値を収集する

array[4]{
    [0]=>
    string(2) "1234"
    [1]=>
    string(7) "5678"
    [2]=>
    string(7) "9ab"
    [3]=>
    string(10) "cdefg"
    ...
}

しかし、そのデータが次のような多次元連想配列形式で必要です...

array[2]{
[0] =>
    array[2]{
        ["alpha"]=>
        string(2) "1234"
        ["beta"]=>
        string(7) "5678"
    }
[1] =>
    array[2]{
        ["alpha"]=>
        string(7) "9ab"
        ["beta"]=>
        string(10) "cdefg"
}

2 つの独立したループでこれを行うことができました。1 つはメソッド データを 2 次元配列にループし、もう 1 つはその配列をループしてインデックス値を手動で連想値に変更します。

    $key_labels = array('alpha','beta');
    $row_num = $col_num = 0;
    $rows = array(
                array(),
                array()
            );

    /* Parse the query into a two-dimensional array */
    foreach ($objs as $obj) {
        $rows[$row_num][$col_num++] = $obj->nodeValue;

        if ($col_num == count($key_labels)) {   
            $col_num = 0;
            $row_num++;
        }
    }

    /* Change the array second dimension index values to associative values */
    foreach ($rows as $rows_idx => $row) {
        unset($rows[$rows_idx]);
        foreach ($row as $row_idx => $row_val) {
            $rows[$rows_idx][$key_labels[$row_idx]] = $row_val;
        }
    }

    var_dump($rows);

私の質問は... 2 つの冗長な (そして一見不格好な) ループを使用するよりも直接的にこれを達成する方法はありますか? それともこれが本当に最善の方法ですか?

注: オブジェクトは常に、カウントの偶数係数に等しい行数を返すことが期待され$key_labelsます。

4

4 に答える 4

1
$i = 0;
foreach ($objs as $j => $obj) {
  $data[$j % 2 == 0 ? ++$i : $i][$j % 2 == 0 ? 'alpha' : 'beta'] = $obj->getValue;
}

var_dump($data);
于 2012-05-26T03:12:25.133 に答える
1

テストされておらず、php 5.3 が必要です。ただし、5.3 がない場合は、array_map と無名関数を別の foreach に置き換えることができます。

$vals = array();
foreach ($objs as $obj) {
    $vals[] = $obj->nodeValue;
}

$key_labels = array('alpha','beta');

$result = array_map(array_chunk($vals, count($key_labels)), function($chunkOfVals) use ($key_labels) {
    return array_combine($key_labels, $chunkOfVals);
});

編集 - 5.3 以外の方法です。正直なところ、私はそれを書いた後、この方法が好きです。はるかに明確です。

$result = array();
foreach (array_chunk($vals, count($key_labels)) as $chunkOfVals) {
    $result[] = array_combine($key_labels, $chunkOfVals);
}
于 2012-05-24T18:14:53.923 に答える
0

おそらく、配列 key に特定の obj 値を使用できます。

foreach( $objs as $obj) {
     $array[$obj->name] = $obj->getValues();
}

または、ref によって渡される配列を取得するメソッドを作成します。

于 2012-05-24T18:15:49.067 に答える
0

リングに帽子を投げる:

$myArray = array();
$tempArray = array();

$counter = 0;
foreach($objs as $obj) {

    $tempArray[$key_labels[$counter % 2]] = $obj->getValue;

    if($counter % 2 == 0) {
        $myArray[] = $tempArray;
        $tempArray = array();
    }

    $counter++;
}

完全なデモはこちら: http://codepad.org/dCX9KEcB

結果は次のようになります。

array(4) {
  [0]=>
  array(1) {
    ["alpha"]=>
    int(12345)
  }
  [1]=>
  array(2) {
    ["beta"]=>
    int(78945)
    ["alpha"]=>
    int(43579)
  }
  [2]=>
  array(2) {
    ["beta"]=>
    int(29853)
    ["alpha"]=>
    int(63542)
  }
  [3]=>
  array(2) {
    ["beta"]=>
    int(75675)
    ["alpha"]=>
    int(12233)
  }
于 2012-05-24T18:52:31.737 に答える