2016-04-23 2 views
-2

Для системы, которая у меня есть, он использует следующий код для получения вопросов в порядке позиции:Переместить Вопросы вверх и вниз - PHP

foreach ($questionnaire->questions->sortBy('position_number') as $question) 

Want Я хочу быть в состоянии сделать это для каждого вопроса ид для получения доступа к предыдущему идентификатору вопроса и следующему идентификатору вопроса. Поэтому, если у меня есть вопрос id 1, который имеет позицию 3, например, я хотел бы получить доступ к вопросу id 3, который имеет позицию 2 и вопрос id 5, который имеет позицию 4.

+1

Мы понятия не имеем, как это сделать без дополнительной информации о ваших классах и о том, что вы на самом деле хотите сделать. Пожалуйста, прочитайте о [** Как задать вопросы здесь **] (http://stackoverflow.com/questions/how-to-ask). –

ответ

0

ЕСЛИ и ТОЛЬКО ЕСЛИ массив представляет собой последовательный массив, следующий код должен работать:

$myArray = ($questionnaire->questions->sortBy('position_number'); 
foreach ($myArray as $key => $value) 
{ 
    $keyPrev = $key - 1; 
    $keyNext = $key + 1; 

    echo "Next value is ".$myArray[$keyNext]."<br>"; 
    echo "Current value is ".$value."<br>"; 
    //OR 
    echo "Current value is ".$myArray[$key]."<br>"; 

    if ($key > 0) 
    echo "Previous value was ".$myArray[$keyPrev]."<br>"; 
} 

забудьте проверить if ($key > 0) перед использованием $keyPrev, потому что в первой итерации, вы по-прежнему будете рассчитывать на $ keyPrev и что $ keyPrev будет недействительным.

+0

Это может объяснить, почему я не получаю правильные значения. Кажется, я получаю индекс для каждого цикла, а не фактические значения идентификатора вопроса. Поскольку каждый набор вопросов в анкете будет иметь уникальный номер позиции, могу ли я сделать, где утверждение в каждой позиции и получить вопрос ids таким образом? Это когда пользователь нажимает кнопку вверх или вниз. Вероятно, это будет довольно грязно, если я попытаюсь преобразовать путь в последовательный. – userrandomuser

+0

@userrandomuser есть хороший шанс. Вероятно, это зависит от того, как вы создали массив. Вы можете перейти к функции sortBy и сделать так, чтобы она была последовательной при создании, и это также должно решить ее :) – Webeng

+0

ОК. Я решил сделать что-то похожее на это с номерами позиций, а не на идентификаторы вопросов. Этот подход работает. Спасибо! – userrandomuser

0

Возьмите ключи массива, используя array_keys(), а затем foreach как обычно. Используйте счетчик, чтобы отслеживать, на каком ключе вы находитесь. Это будет работать даже с нечисловыми индексами.

$counter = 0; 
// store it so that we can access it however we like 
$questions = $questionnaire->questions->sortBy('position_number'); 
// get an array of keys of the $questions array. They are returned in order. 
$questionKeys = array_keys($questions); 
// use to check that there is a next question 
$countKeys = count($keys) - 2; 

foreach($questions as $question) { 
    // only want to access the previous question if there is a previous question 
    if ($counter > 0) { 
    $previousQuestion = $questions[$questionKeys[$counter - 1]]; 
    // do interesting things with the previous question 
    } 

    // only access the next question if there is a next question 
    if ($counter < $countKeys) { 
    $nextQuestion = $questions[$questionKeys[$counter + 1]]; 
    //do interesting things 
    } 
    $counter++; 
} 
Смежные вопросы