这与其说是 PHP 问题,不如说是算法问题,但我似乎无法弄明白!
我有一个多维数组如下:
[
210875 => ["2", "1"],
129096 => ["2", "2"]
]
有 2 个 ID,但可以有更多。根据这些条件,我只想在我的表中保留 1 个 ID。
伪代码:
if a[0] == 1 and a[1] >= 1: # the id gets deleted right away without looking at other conditions
if a[0] >= 2 and a[1] == 2: # it stays if nothing below fits else it gets deleted
if a[0] >= 3 and a[1] == 3: # it stays if nothing below fits else it gets deleted
if a[0] >= 8 and a[1] == 4: # it stays if nothing below fits else it gets deleted
# ... etc
如果两个符合相同条件,则其中一个随机被删除。
例如(伪代码):
a[0] == 2 and a[1] == 1
a[0] == 2 and a[1] == 2
我试过执行以下操作,但我无法弄清楚如何动态地使 if 条件依赖于我的算法:
$sub_array = array();
foreach($array as $k=>$v) {
if($v[0] == 1 && $v[1] == 1) continue;
if($v[0] >= 2 && $v[1] == 2) $sub_array[$k] = $v;
if($v[0] >= 6 && $v[1] == 3) $sub_array[$k] = $v;
if($v[0] >= 8 && $v[1] == 4) $sub_array[$k] = $v;
// etc ...
}
此外,当我这样做时,如何知道子数组中最高的是哪一个?
最佳答案
我不完全清楚你的条件是什么,但对我来说,你似乎真的在给你的每一行排名,最后你想保留排名最高的行。
即使我对您的规则的解释可能不完全符合您的预期,您也可以通过调整下面代码中的分数来调整它。我还建议交换条件,以便 ==
比较先出现。这样会更有效率:
$keepKey = null;
$bestScore = -1;
foreach($array as $k=>$v) {
$score = 0;
if ($v[1] == 1 && $v[0] == 1) $score = 1;
if ($v[1] == 2 && $v[0] >= 2) $score = 2;
if ($v[1] == 3 && $v[0] >= 6) $score = 3;
if ($v[1] == 4 && $v[0] >= 8) $score = 4;
// ... etc ...
if ($score > $bestScore) {
$keepKey = $k;
$bestScore = $score;
}
}
$sub_array = [$keepKey => $array[$keepKey]]; // Only keep the entry with highest score
如果在平局的情况下真的随机选择一个很重要,那么在开始循环之前洗牌:
$keepKey = null;
$bestScore = -1;
$keys = array_keys($array); // <---
shuffle($keys); // <
foreach($keys as $k) { // <
$v = $array[$k]; // <---
$score = 0;
if ($v[1] == 1 && $v[0] == 1) $score = 1;
if ($v[1] == 2 && $v[0] >= 2) $score = 2;
if ($v[1] == 3 && $v[0] >= 6) $score = 3;
if ($v[1] == 4 && $v[0] >= 8) $score = 4;
echo $score . "\n";
if ($score > $bestScore) {
$keepKey = $k;
$bestScore = $score;
}
}
$sub_array = [$keepKey => $array[$keepKey]];
关于php - 根据条件从数组中删除值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53559860/