Misc/Util

* relax numeric type requirements when working with filters
 * restore smart type casting functionality of Util::checkNumeric when used with NUM_ANY
 * enable Util::arraySumByKey to work recursively
 * fix source display in listview
This commit is contained in:
Sarjuuk
2024-06-16 17:05:23 +02:00
parent a4d05dc036
commit cb3c7d4ef0
6 changed files with 30 additions and 20 deletions

View File

@@ -166,7 +166,7 @@ abstract class BaseType
$op = (isset($c[2]) && $c[2] == '!') ? 'NOT IN' : 'IN';
$val = '('.implode(', ', $c[1]).')';
}
else if (Util::checkNumeric($c[1]))
else if (Util::checkNumeric($c[1])) // Note: should this be a NUM_REQ_* check?
{
$op = (isset($c[2]) && $c[2] == '!') ? '<>' : '=';
$val = $c[1];
@@ -880,7 +880,7 @@ trait sourceHelper
$s = array_keys($this->sources[$this->id]);
if ($this->curTpl['moreType'] && $this->curTpl['moreTypeId'] && ($srcData = $this->sourceMore[$this->curTpl['moreType']]->getSourceData($this->curTpl['moreTypeId'])))
$sm = $srcData;
$sm = $srcData[$this->curTpl['moreTypeId']];
else if (!empty($this->sources[$this->id][SRC_PVP]))
$sm['p'] = $this->sources[$this->id][SRC_PVP][0];

View File

@@ -393,7 +393,7 @@ class CreatureListFilter extends Filter
if (!$this->parentCats || $this->parentCats[0] != 1)
return false;
if (!Util::checkNumeric($val, NUM_REQ_INT))
if (!Util::checkNumeric($val, NUM_CAST_INT))
return false;
$type = FILTER_V_LIST;
@@ -518,7 +518,7 @@ class CreatureListFilter extends Filter
protected function cbFaction($cr)
{
if (!Util::checkNumeric($cr[1], NUM_REQ_INT))
if (!Util::checkNumeric($cr[1], NUM_CAST_INT))
return false;
if (!in_array($cr[1], $this->enums[$cr[0]]))

View File

@@ -2503,7 +2503,7 @@ class ItemListFilter extends Filter
protected function cbDisenchantsInto($cr)
{
if (!Util::checkNumeric($cr[1], NUM_REQ_INT))
if (!Util::checkNumeric($cr[1], NUM_CAST_INT))
return false;
if (!in_array($cr[1], $this->enums[$cr[0]]))
@@ -2620,7 +2620,7 @@ class ItemListFilter extends Filter
if (!$this->parentCats)
return false;
if (!Util::checkNumeric($v, NUM_REQ_INT))
if (!Util::checkNumeric($v, NUM_CAST_INT))
return false;
$c = $this->parentCats;
@@ -2650,7 +2650,7 @@ class ItemListFilter extends Filter
protected function cbSlotCheck(&$v)
{
if (!Util::checkNumeric($v, NUM_REQ_INT))
if (!Util::checkNumeric($v, NUM_CAST_INT))
return false;
// todo (low): limit to concrete slots

View File

@@ -557,7 +557,7 @@ class QuestListFilter extends Filter
protected function cbReputation($cr, $sign)
{
if (!Util::checkNumeric($cr[1], NUM_REQ_INT))
if (!Util::checkNumeric($cr[1], NUM_CAST_INT))
return false;
if (!in_array($cr[1], $this->enums[$cr[0]]))
@@ -593,7 +593,7 @@ class QuestListFilter extends Filter
protected function cbCurrencyReward($cr)
{
if (!Util::checkNumeric($cr[1], NUM_REQ_INT))
if (!Util::checkNumeric($cr[1], NUM_CAST_INT))
return false;
if (!in_array($cr[1], $this->enums[$cr[0]]))
@@ -672,7 +672,7 @@ class QuestListFilter extends Filter
protected function cbEarnReputation($cr)
{
if (!Util::checkNumeric($cr[1], NUM_REQ_INT))
if (!Util::checkNumeric($cr[1], NUM_CAST_INT))
return false;
if ($cr[1] == FILTER_ENUM_ANY) // any

View File

@@ -2678,7 +2678,7 @@ class SpellListFilter extends Filter
if (!$this->parentCats || !in_array($this->parentCats[0], [-13, -2, 7]))
return false;
if (!Util::checkNumeric($val, NUM_REQ_INT))
if (!Util::checkNumeric($val, NUM_CAST_INT))
return false;
$type = FILTER_V_LIST;
@@ -2692,7 +2692,7 @@ class SpellListFilter extends Filter
if (!$this->parentCats || $this->parentCats[0] != -13)
return false;
if (!Util::checkNumeric($val, NUM_REQ_INT))
if (!Util::checkNumeric($val, NUM_CAST_INT))
return false;
$type = FILTER_V_LIST;

View File

@@ -970,7 +970,7 @@ abstract class Util
}
// doesn't handle scientific notation .. why would you input 3e3 for 3000..?
public static function checkNumeric(&$data, $typeCast = NUM_ANY)
public static function checkNumeric(&$data, $typeCast = NUM_ANY) : bool
{
if ($data === null)
return false;
@@ -991,7 +991,7 @@ abstract class Util
(!is_float($data) && $typeCast == NUM_REQ_FLOAT))
return false;
$number = $data; // do not transform strings, store state
$number = $data; // do not transform strings, store state
$nMatches = 0;
$number = trim($number);
@@ -1002,7 +1002,7 @@ abstract class Util
{
if ($typeCast == NUM_CAST_INT)
$data = intVal($number);
else if ($typeCast == NUM_CAST_FLOAT)
else // NUM_CAST_FLOAT || NUM_ANY
$data = floatVal($number);
return true;
@@ -1012,10 +1012,10 @@ abstract class Util
if (is_numeric($number) || preg_match('/^0[xb]?\d+/', $number))
{
$number = intVal($number, 0); // 'base 0' auto-detects base
if ($typeCast == NUM_CAST_INT)
$data = $number;
else if ($typeCast == NUM_CAST_FLOAT)
if ($typeCast == NUM_CAST_FLOAT)
$data = floatVal($number);
else // NUM_CAST_INT || NUM_ANY
$data = $number;
return true;
}
@@ -1034,9 +1034,19 @@ abstract class Util
foreach ($arr as $k => $v)
{
if (!isset($ref[$k]))
$ref[$k] = 0;
{
if (is_array($v))
$ref[$k] = [];
else if (Util::checkNumeric($v))
$ref[$k] = 0;
else
continue;
}
$ref[$k] += $v;
if (is_array($ref[$k]) && is_array($v))
Util::arraySumByKey($ref[$k], $v);
else if (Util::checkNumeric($ref[$k]) && Util::checkNumeric($v))
$ref[$k] += $v;
}
}
}