如何计算数组项的位置


How to calculate position of array item?

我有一个数组,里面有一大堆徽章。我有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);

尝试以下步骤

  1. 内爆现有数组,使其看起来像array('a,b,c,d,e')
  2. 要做到这一点,首先内爆$data中的内部数组,使其成为array(['a,b,c'],['d,e']),然后内爆该数组,它将给您一个array('a,b,c,d,e')
  3. 一旦你得到了这个,那么使用$key = array_search($value, $array);,你可以分别得到值"b"、"c"、"e"="2"、"3"、"5"的索引(假设这些数字分别保存在变量$start$current$end中)
  4. 既然你现在有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++;
    }
}

使用此代码将为数组中的每个项提供一个唯一的索引。那么,距离的计算只是一些减法。