Return 数组中大于 X 的数字
Return number in array that is greater than X
以下代码自动查找页面上的最高价格:
$vw_link = get_field('shop_link');
$ch = curl_init($vw_link);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$cl = curl_exec($ch);
$dom = new DOMDocument();
@$dom->loadHTML($cl);
$xpath = new DOMXpath($dom);
$price = $xpath->query("//span[@class='price']");
foreach($price as $value) {
$vw_array[] = floatval(str_replace('$', '', $value->nodeValue));
update_field('shop_price',max($vw_array));
}
什么是最好的东西,因为切片奶酪是如果它可以 return $vw_array 中的值介于特定数量之间,即大于 100 和小于 200。如果 100-200 之间有多个数字,棘手的部分是 return 计算 100 之后的 第一个 最大数字。
例如(如果以下价格都包裹在'price'class):
5 <-- return this number
5
0
0
有谁知道怎么想出这么厉害的函数吗?
我想如果我理解正确的话,这应该可以。你可以去掉你的 $
如果它在那里。
function ReturnFirst($array = array(), $low = 0, $high = 0) {
foreach($array as $value) {
if(($value >= $low) && ($value <= $high)) {
// When first number hit, just return it
return $value;
}
}
// This will return false if it doesn't return any results
return false;
}
echo
$number = ReturnFirst(array(10,20,30,40,50,60), 35,60);
// This will return the number 40
function getHighestValue($arr, $high = 200, $low =100) {
$data = $arr;
// sort it so you can find 1st highest value in range
asort($data);
foreach ($data as $item) {
//trim dollar sign as i can see from your example
$item = ltrim($item, "$");
if ($item >= $low && $item <= $high) {
return $item;
}
}
return false;
}
所以如果你的数据是
$arr = [
'0',
'',
'3',
'9',
];
var_dump(getHighestValue($arr)); // will return 140
你也可以在后面加上美元符号
假设一个标准的排序数组,即元素按升序或降序排列,索引为 0、1、2...,对于更大的数组,最快的方法是二分搜索算法。
// assuming sorted $a, looking for $value as lowest value
$low = 0;
$high = count($a);
while ($low < $high) {
$middle = (($high - $low) >> 1) + $low; // same as floor(($high - $low) / 2)
if ($a[$middle] < $value) // or: strcmp($a[$middle], $value) < 0
$low = $middle + 1;
else
$high = $middle;
}
最后,$low
变量将包含排序数组中 $value
的最早可能插入索引。换句话说,如果 $low
小于数组的长度,它将指向你想要的值,如果它小于你的上限值。否则数组不包含与您的请求匹配的值。
但是,如果您只处理较短的数组,线性搜索可能会更快,因为它降低了复杂性。
代码:
$Max = 15;
$Min = 10;
$A = ['','','','','','','','']; // Array in
foreach($A As $V){
$B = ltrim($V, "$");
if($B >= $Min && $B <= $Max) {
$C[] = $V;
}
}
print_r($C);
输出:
以下代码自动查找页面上的最高价格:
$vw_link = get_field('shop_link');
$ch = curl_init($vw_link);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$cl = curl_exec($ch);
$dom = new DOMDocument();
@$dom->loadHTML($cl);
$xpath = new DOMXpath($dom);
$price = $xpath->query("//span[@class='price']");
foreach($price as $value) {
$vw_array[] = floatval(str_replace('$', '', $value->nodeValue));
update_field('shop_price',max($vw_array));
}
什么是最好的东西,因为切片奶酪是如果它可以 return $vw_array 中的值介于特定数量之间,即大于 100 和小于 200。如果 100-200 之间有多个数字,棘手的部分是 return 计算 100 之后的 第一个 最大数字。
例如(如果以下价格都包裹在'price'class):
5 <-- return this number
5
0
0
有谁知道怎么想出这么厉害的函数吗?
我想如果我理解正确的话,这应该可以。你可以去掉你的 $
如果它在那里。
function ReturnFirst($array = array(), $low = 0, $high = 0) {
foreach($array as $value) {
if(($value >= $low) && ($value <= $high)) {
// When first number hit, just return it
return $value;
}
}
// This will return false if it doesn't return any results
return false;
}
echo
$number = ReturnFirst(array(10,20,30,40,50,60), 35,60);
// This will return the number 40
function getHighestValue($arr, $high = 200, $low =100) {
$data = $arr;
// sort it so you can find 1st highest value in range
asort($data);
foreach ($data as $item) {
//trim dollar sign as i can see from your example
$item = ltrim($item, "$");
if ($item >= $low && $item <= $high) {
return $item;
}
}
return false;
}
所以如果你的数据是
$arr = [
'0',
'',
'3',
'9',
];
var_dump(getHighestValue($arr)); // will return 140
你也可以在后面加上美元符号
假设一个标准的排序数组,即元素按升序或降序排列,索引为 0、1、2...,对于更大的数组,最快的方法是二分搜索算法。
// assuming sorted $a, looking for $value as lowest value
$low = 0;
$high = count($a);
while ($low < $high) {
$middle = (($high - $low) >> 1) + $low; // same as floor(($high - $low) / 2)
if ($a[$middle] < $value) // or: strcmp($a[$middle], $value) < 0
$low = $middle + 1;
else
$high = $middle;
}
最后,$low
变量将包含排序数组中 $value
的最早可能插入索引。换句话说,如果 $low
小于数组的长度,它将指向你想要的值,如果它小于你的上限值。否则数组不包含与您的请求匹配的值。
但是,如果您只处理较短的数组,线性搜索可能会更快,因为它降低了复杂性。
代码:
$Max = 15;
$Min = 10;
$A = ['','','','','','','','']; // Array in
foreach($A As $V){
$B = ltrim($V, "$");
if($B >= $Min && $B <= $Max) {
$C[] = $V;
}
}
print_r($C);
输出: