1

以下の配列には、1 ~ 7 のすべての「ポイント」値の子配列が必要ですが、2、4、および 6 がありません。NULL の「値」を使用して、欠落している値ごとに配列を挿入するにはどうすればよいですか?

for($i = 1; $i <= 7; $i++)配列に対して and 内部で foreach を実行しているかどうかを確認しようとしましたが、うまくいき'point' == $iません。

これはすでにかなり大きな配列のネストされた foreach に含まれているため、パフォーマンスが多少重要になります。

これまでのコード (不完全で、明らかに機能していません)

foreach($measurements as $measurement_id => $set)
        {
            for($i = 1; $i <= 7; $i++)
            {
                foreach($set as $key => $value)
                {
                    $fill = array('value' => null);

                    if($value['point'] == $i)
                        $output[$measurement_id][$key] = $value;
                    else
                        $output[$measurement_id][$key] = $fill;
                }
            }
        }

配列:

            [0] => Array
                (
                    [point] => 1
                    [value] => 1.0
                )

            [1] => Array
                (
                    [point] => 3
                    [value] => 2.0
                )

            [2] => Array
                (
                    [point] => 5
                    [value] => 3.0
                )

            [3] => Array
                (
                    [point] => 7
                    [value] => 4.0
                )

結果は

             [0] => Array
                (
                    [point] => 1
                    [value] => 1.0
                )

            [1] => Array
                (
                    [point] => 2
                    [value] => NULL
                )

            [2] => Array
                (
                    [point] => 3
                    [value] => 2.0
                )

            [3] => Array
                (
                    [point] => 4
                    [value] => NULL
                )
            [4] => Array
                (
                    [point] => 5
                    [value] => 3.0
                )

            [5] => Array
                (
                    [point] => 6
                    [value] => NULL
                )

            [6] => Array
                (
                    [point] => 7
                    [value] => 4.0
4

2 に答える 2

1

これを試して:

$oldArr = [ ..your incomplete array.. ];
$newArr = array();

for ($i = 1; $i < 8; ++$i) {
  $new = array(
    'point' => $i,
    'value' => NULL,
  );

  foreach($oldArr as $old) {
    if ($old['point'] == $i) {
      $new['value'] = $old['value'];
    }
  }

  $newArr[] = $new;
}

$newArr必要に応じてすべての値を含める必要があります。

于 2012-12-07T17:06:01.867 に答える
1

元の配列が例のように並べられてpointいる場合、1 つのループでのみ実行できます。

$result = array();
for ($i = 1; $i <= 7; $i++)
{
  // get the first element of your set
  $current = reset($set);
  if ($current['point'] === $i)
  {
    // remove the first element of your set and assign it to the result array
    $result[$i - 1] = array_shift($set);
  }
  else
  {
    // create a new, empty entry
    $result[$i - 1] = array('point' => 1, 'value' => NULL);
  }
}

新しい配列を作成し、元の配列から値を削除していることに注意してください。リソース/パフォーマンスが本当に心配な場合は、同じ原則を使用して逆方向にループし (7 から 1 へ)、配列の最後の要素を正しい位置に移動し、同じ方法で空のスペースを埋めることができます。

于 2012-12-07T17:17:14.060 に答える