Сохранить уникальный узел с наименьшим значением второго индекса - PullRequest
0 голосов
/ 31 мая 2018

Я работаю над многомерным массивом в PHP.Как можно выбрать уникальные значения из индекса 0 вложенного массива, который имеет самое низкое значение по индексу 1?

Ниже приведен мой пример массива данных

$data = array (
    array(1, 9),
    array(1, 3),
    array(1, 5),
    array(9, 2),
    array(9, 7),
);

Я пытаюсь получить следующеемассив в результате

$result = array (
    array(1, 3),
    array(9, 2),
);

Ответы [ 4 ]

0 голосов
/ 31 мая 2018

Это так же ясно, как грязь, но я сделал это в качестве примера, что он работает без зацикливания.

Короче говоря, я использую min и array_intersect (_key), чтобы найти минимальные значения в столбцах (с array_column).

//split out the two columns
$col0 = array_column($data, 0);
$col1 = array_column($data, 1);

// find minimum value in each
$min0 = min($col0);
$min1 = min($col1);

// find what keys this minimum value is in of each array
$mincol0 = array_intersect($col0, [$min0]);
$mincol1 = array_intersect($col1, [$min1]);

// use the previous and compare with minimum value of the other column
$result[] = $data[array_keys(array_intersect_key($col1, $mincol0),min(array_intersect_key($col1, $mincol0)))[0]];
$result[] = $data[array_keys(array_intersect_key($col0, $mincol1),min(array_intersect_key($col0, $mincol1)))[0]];

Var_dump($result);

https://3v4l.org/dgbDK

Так как я совершенно неправильно понял вопрос.
Вот еще один ответ, все еще не нужно зацикливать весь массив.Это просто трата времени.

Зацикливать только уникальные значения столбца 0 и находить минимальное значение в столбце 1, используя array_intersect и array_intersect_key.

$col0 = array_column($data, 0);

foreach(array_unique($col0) as $item){
    $intersect = array_intersect($col0, [$item]);
    $res[] = min(array_intersect_key($data, $intersect));

}

var_dump($res);

https://3v4l.org/3UPQh

0 голосов
/ 31 мая 2018

Одним из способов сделать это может быть цикл в массиве, использование индексов массивов и сравнение второго значения.Если сохраненное второе значение больше нового, перезапишите его.

$data = array (
    array(1, 9),
    array(1, 3),
    array(1, 5),
    array(9, 2),
    array(9, 7),
);

$result = [];
foreach ($data as $d) {
    if (!isset($result[$d[0]])) {
        $result[$d[0]] = $d;
        continue;
    }
    if ($result[$d[0]][1] > $d[1]) {
        $result[$d[0]] = $d;
    }
}

print_r($result);

Демо

0 голосов
/ 31 мая 2018

Коротко и грязно:

$data = array (
    array(1, 9),
    array(1, 3),
    array(1, 5),
    array(9, 2),
    array(9, 7),
);

foreach ($data as $row) {
 ($row[1] < ($uniq[$row[0]][1] ?? INF)) and $uniq[$row[0]] = $row;
}

var_dump($uniq);

Пропустите полученный массив через array_values, если для вас важна реиндексация с 0

0 голосов
/ 31 мая 2018
$data = array (
array(1, 9),
array(1, 3),
array(1, 5),
array(9, 2),
array(9, 7),
);

$result = [];
$lowest0 = null;
$lowest1 = null;

foreach($data as $row){
    if($lowest0 === null || $row[0] < $lowest0[0] || ($row[0] === $lowest0[0] && $row[1] < $lowest0[1]))
    {
        $lowest0 = $row;
    }

    if($lowest1 === null || $row[1] < $lowest1[1] || ($row[1] === $lowest1[1] && $row[0] < $lowest0[0]))
    {
        $lowest1 = $row;
    }
}

$result = [$lowest0,$lowest1];

var_dump($result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...