我有一个数组,里面有一大堆徽章。我有3个来自数据库的变量。我需要一些关于如何计算$current变量到$start和$end变量的位置,然后输出为%的int的想法。
示例:
$data = array(
['a','b','c'],
['d','e']
);
$start = 'b';
$current = 'c';
$end = 'e';
*Some maths equation to return position value?*
我唯一的想法是,我可能会以某种方式计算出$start和$end之间有多少变量,并以某种方式减去$current的位置?
更新
我试过你的代码,但我想我在某个地方搞砸了:
// Progress Bar configurations
$data = array(
array('diamond_V','diamond_IV','diamond_III','diamond_II','diamond_I'),
array('platinum_V','platinum_IV','platinum_III','platinum_II','platinum_I'),
array('gold_V','gold_IV','gold_III','gold_II','gold_I'),
array('silver_V','silver_IV','silver_III','silver_II','silver_I'),
array('bronze_V','bronze_IV','bronze_III','bronze_II','bronze_I')
);
$start = $start_rank;
$current = $current_rank;
$end = $finish_rank;
foreach($data as $key => &$value){
$value = implode(",", $value);
}
$dataimplode = implode(",", $data);
$key = array_search($current, $dataimplode);
var_dump($key);
尝试以下步骤
- 内爆现有数组,使其看起来像
array('a,b,c,d,e')
- 要做到这一点,首先内爆
$data
中的内部数组,使其成为array(['a,b,c'],['d,e'])
,然后内爆该数组,它将给您一个array('a,b,c,d,e')
- 一旦你得到了这个,那么使用
$key = array_search($value, $array);
,你可以分别得到值"b"、"c"、"e"="2"、"3"、"5"的索引(假设这些数字分别保存在变量$start
、$current
和$end
中) - 既然你现在有3个数值,你就可以很容易地通过公式
(($current-$start)/($end-$start))*100
找到"3"的%
使用以下代码片段实现$data
$data = array(
array("a","b","c"),
array("d","e","f")
);
foreach($data as $key => &$value){
$value = implode(",", $value);
}
$dataimplode = explode(",",(implode(",", $data)));
print_r($dataimplode);
您可以执行以下操作:
首先获取每个项目的位置:
- $start应为0
- 带array_search()的$current
- $以count()结尾
一旦你的3个变量是数字,就到了做一些数学运算的时候了。
($current - $start) / ($end - $start )
会给你百分比,即使你使用负数(只要$end>$current>$start)。
以下函数将返回一个包含(i,j)
的数组,这意味着值$needle
可以在$haystack[i][j]
上找到。此函数最多只支持2个数组的级联,例如:array(array())。
function recursive_array_search($needle,$haystack) {
foreach($haystack as $key=>$value) {
$some=array_search($needle,$value);
if(is_array($value) && $some !== false){
return array($key, $some);
}
}
return false;
}
下面将给出给定(i, j)
和$data
数组的总索引。此函数最多只支持2个数组的级联,例如:array(array())。
function gettotalindex($index, $array)
{
$j = 0;
for($i=0; $i<$index[0]; $i++)
{
$j += count($array[$i]);
}
$j += $index[1];
return $j;
}
您可以通过以下方式同时使用这两种功能:
$start = gettotalindex(recursive_array_search('b', $data), $data);
不过,我已经加入了他们,所以您将能够使用recursive_total_index('b', $data)
获得总索引,并使其完全递归,支持无限数量的级联:
function recursive_total_index($needle, $haystack) {
$index = 0;
if(!is_array($haystack)) return false;
foreach($haystack as $key=>$value) {
$index += ($key>0 ? count($haystack[$key-1]) : 0);
$some = recursive_total_index($needle,$value);
if(is_array($value) && $some !== false){
return $index+$some;
}
else if(!is_array($value) && $needle===$value)
{
return $key;
}
}
return false;
}
使用示例:
$data = array( ['a','b'], ['c','d'], array(['e','f'],['g','h'], array(['i','j'])));
echo recursive_total_index('i', $data);
*Outputs 8*
然后做减法,做你想做的事。
我对你的数据结构了解不多,但一个通用的解决方案应该是嵌套循环:
$i = 0;
$startPos = -1;
$endPost = -1;
$currentPos = -1;
foreach ($data as $row) {
foreach ($row as $item) {
if ($item == $start) $startPos = $i;
if ($item == $current) $currentPos = $i;
if ($item == $end) $endPos = $i;
$i++;
}
}
使用此代码将为数组中的每个项提供一个唯一的索引。那么,距离的计算只是一些减法。