根据元素位置创建新数组

时间:2018-10-11 19:12:46

标签: php arrays

我有一个像这样的数组

$dataArray = array(
    array( 20800, 21679, 0 ),
    array( 15254, 0, 3726 ),
    array( 17426, 2973, 0 ),
    array( 4391, 37, 0 ),
    array( 39194, 435, 0 )
);

我正在由此创建一个子数组。任何大于2000的值都将变为1,否则将变为0。

foreach ($dataArray as $row => $data) {
    foreach ($data as $key => $value) {
        if($value > 1999) {
            $dataArray[$row][$key] = 1;
        } else {
            $dataArray[$row][$key] = 0;
        }
    }
}

这将产生以下内容

$dataArray = array(
    array( 1, 1, 0 ),
    array( 1, 0, 1 ),
    array( 1, 1, 0 ),
    array( 1, 0, 0 ),
    array( 1, 0, 0 )
);

现在我要做的是生成另一个数组,该数组显示上面数组中1的位置。每行应由一个新数组表示。我正在寻找的输出是这个

$dataArray = array(
    array( 1, 2 ),
    array( 1, 3 ),
    array( 1, 2 ),
    array( 1 ),
    array( 1 )
);

所以我可以看到第1行在位置1和2处有1,第2行在位置1和3处有1等。

我想利用当前循环,所以我正在尝试类似的事情

$position = array();

foreach ($dataArray as $row => $data) {
    foreach ($data as $key => $value) {
        if($value > 1999) {
            $position[$row] = $key + 1;
            $dataArray[$row][$key] = 1;
        } else {
            $dataArray[$row][$key] = 0;
        }
    }
}

但是根据我的输出,这似乎还差得远。我该如何实现自己的追求?

谢谢

3 个答案:

答案 0 :(得分:2)

您可以将array_maparray_keys一起使用:

$dataArray = [
  [1, 1, 0],
  [1, 0, 1],
  [1, 1, 0],
  [1, 0, 0],
  [1, 0, 0]
];

$onePositions = array_map(function($row) {
  return array_map(function($position) { return $position + 1; }, array_keys($row, 1));
}, $dataArray);

echo '<pre>'; var_dump($onePositions); echo '</pre>';

Demo here

答案 1 :(得分:2)

<?php
$dataArray = array(
    array( 20800, 21679, 0 ),
    array( 15254, 0, 3726 ),
    array( 17426, 2973, 0 ),
    array( 4391, 37, 0 ),
    array( 39194, 435, 0 )
);
$endResult = [];

foreach ($dataArray as $key => $value) {
   foreach ($value as $subkey => $subvalue) {
    if ($subvalue >= 2000) {
       $endResult[$key][] = $subkey +1;
    }
   }
}

print_r($endResult);

Array
(
[0] => Array
    (
        [0] => 1
        [1] => 2
    )

[1] => Array
    (
        [0] => 1
        [1] => 3
    )

[2] => Array
    (
        [0] => 1
        [1] => 2
    )

[3] => Array
    (
        [0] => 1
    )

[4] => Array
    (
        [0] => 1
    )
)

答案 2 :(得分:1)

您可以使用array_keys()函数中的第二个参数在填充一个和一个零之后获取位置:

$position = array();
$binary = array();

foreach ($dataArray as $row => $data) {

    // if you want to have the positions start at 1 instead of 0
    // add a dummy value to the final array
    $binary[$row][] = 0;

    foreach ($data as $key => $value) {
        if($value > 1999) {
            $binary[$row][] = 1;
        } else {
            $binary[$row][] = 0;
        }
    }
    $positions[] = array_keys($binary[$row], 1);
}

Demo Here