如何计算数组项的位置?

时间:2015-10-28 08:48:42

标签: php

好的,我有一大堆带有一大堆徽章的阵列。我有3个来自数据库的变量。我需要知道如何计算$ current变量在$ start和$ end变量中的位置,然后输出为%的int。

示例:

for (int i = 0; i < 10; i++) {
    CustomUIView *setView = [[[NSBundle mainBundle] loadNibNamed:@"CustomUIView" owner:nil options:nil] objectAtIndex:0];
    setView.frame = CGRectMake(10, 10 + (10*i) + (i*100), self.view.frame.size.width - 20, 100);

    [self.scrollView addSubview:setView];
}
self.scrollView.contentSize = CGSizeMake(self.view.frame.size.width, 10 + (10*10) + (10*100));

我唯一的想法是,我可能会以某种方式计算$ start和$ end之间有多少变量,并以某种方式减去$ current的位置?

感谢您的输入

我尝试了你的代码,但我觉得我搞砸了某个地方:

$data = array(
     ['a','b','c'],
     ['d','e']
);

$start = 'b';
$current = 'c';
$end = 'e';

*Some maths equation to return position value?*

);

// 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')

4 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

首先得到每个项目的位置:

  • $ start应为0
  • $ current with array_search()
  • $ end with count()

然后,一旦你的3个变量是数字,就可以做一些数学了。

($current - $start) / ($end - $start )

即使您使用的是负数(只要$ end&gt; $ current&gt; $ start),也会给您百分比。

答案 1 :(得分:1)

尝试以下步骤

  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
  5. 轻松找到“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);
    

答案 2 :(得分:0)

我不太了解你的数据结构,但是通用的解决方案是嵌套循环

$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++;
    }
}

使用此代码可以为您提供数组中每个项目的唯一索引。距离的计算不仅仅是一些减法。

答案 3 :(得分:0)

以下函数将返回包含(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*

然后只需减去并做你想做的事。