2015-10-28 3 views
0

Хорошо, у меня есть массив со всей связкой значков. У меня есть 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?* 

Единственная идея, у меня есть, я, вероятно, может рассчитывать как-то, сколько переменных между $ начала и конца $ и как-то вычитать положение $ тока?

Спасибо за ваш вклад

Я попробовал ваш код, но я думаю, что я перепутала где:

// 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); 
+0

Тейк посмотрите на это: http://www.w3schools.com/php/func_array_search.asp – VERYNET

+0

Каким будет ваш ожидаемый результат в этом случае? 3, так как это третье значение? – Oldskool

+0

Являются ли массивы разной длины из-за того, что значки связаны каким-то образом? то есть _' ['a', 'b', 'c'] '_ is:' 'dibdib1' => ['a', 'b', 'c'] '? imo, Если ваш индекс массива был текстовым, тогда было бы проще позиционировать его в '$ current'. –

ответ

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 числовые значения теперь вы можете легко найти% от «3» по формуле (($current-$start)/($end-$start))*100

Implode $ данных, используя следующий фрагмент кода

$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); 
+0

Если я буду имплантировать данные, если он уже сделает это правильно или как бы я действительно взорвал каждый из них внутри данных? – Elevant

+0

Нет прямого размытия $ data wont work Запуск цикла foreach на данные, а затем взломать данные Посмотрите на обновленный ответ через 5 минут – Arpita

+0

Я дам этот снимок сегодня и не буду обновлять результат и отмечать его, если он работает правильно – Elevant

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

Используя этот код даст вам и уникальный индекс для каждого элемента в массиве. Расчет расстояния - это просто некоторая вычитание.

1

Вы можете сделать следующее:

Сначала получить позицию каждые пунктов:

  • $ Старт должен быть 0
  • $ тока с array_search()
  • $ конца со счетом ()

Затем, как только ваши 3 вара являются числами, пришло время сделать некоторые математические вычисления.

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

Дает вам процент, даже если вы используете отрицательные числа (до тех пор, пока $ end> ​​$ current> $ start).

+0

может считать() использоваться, чтобы не просто подсчитать весь массив, а между определенными значениями? – Elevant

+0

Yup, мой плохой, только что отредактировал его! – Nirnae

0

Следующая функция вернет массив, содержащий (i,j), то есть значение $needle можно найти на $haystack[i][j]. Эта функция поддерживает только каскад из 2 массивов max, например: 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 массивов max, например: 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* 

Затем просто вычтите и сделайте то, что вы хотите.

+0

Но может ли вышеуказанное вернуть позицию как int или это только для нахождения, если оно существует. – Elevant

+0

Да, уточните мой обновленный ответ –

Смежные вопросы