1

下面的数组应该为从 1 到 7 的每个“点”值创建一个子数组,但缺少 2、4 和 6。如何为每个缺失值插入一个数组,“值”为 NULL?

我在我的数组上尝试了一个for($i = 1; $i <= 7; $i++)and inside foreach'ing 来查看是否'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按照示例中的顺序排序,则只能在一个循环中执行:

$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 回答