установить указатель на указатель массива внутри foreach в соответствии с переменной php [duplicate]

Это означает, что ваш код использовал ссылочную переменную объекта, которая была установлена ​​в нуль (т. е. она не ссылалась на экземпляр фактического объекта).

Чтобы предотвратить ошибку, объекты, которые могут быть пустыми, должны быть протестированы для null перед тем, как использовать.

if (myvar != null)
{
    // Go ahead and use myvar
    myvar.property = ...
}
else
{
    // Whoops! myvar is null and cannot be used without first
    // assigning it to an instance reference
    // Attempting to use myvar here will result in NullReferenceException
}
34
задан chris 28 April 2009 в 00:03
поделиться

7 ответов

Если ваш массив всегда индексируется последовательно (например, «page1» всегда находится в индексе «0»), это довольно просто:

$List = array('page1', 'page2', 'page3', 'page4', 'page5');
$CurrentPage = 3; // 'page4'

while (key($List) !== $CurrentPage) next($List); // Advance until there's a match

Я лично не полагаюсь на автоматическую индексацию, потому что есть всегда есть шанс, что автоматический индекс может измениться. Вы должны явно указать ключи:

$List = array(
    '1' => 'page1',
    '2' => 'page2',
    '3' => 'page3',
);

EDIT: Если вы хотите проверить значения массива (вместо ключей), используйте current() :

while (current($List) !== $CurrentPage) next($List);
34
ответ дан matpie 27 August 2018 в 04:33
поделиться
  • 1
    К сожалению, нет функции манипулятора указателя, к которой вы можете передать индекс. следующий, текущий, сброс, конец и т. д., это все, что у вас есть. Вышесказанное является правильным решением, если вы должны использовать внутренний указатель PHP, а не простой индекс индекса старого массива. – Trey 28 April 2009 в 00:16
  • 2
    как бы я совпадал на основе значения массива eg page1 вместо позиции 1? – chris 28 April 2009 в 00:34
  • 3
    ах его in_array – chris 28 April 2009 в 00:39
  • 4
    Фактически, вы захотите использовать current(). in_array означает, что значение находится в массиве. php.net/current – matpie 28 April 2009 в 08:14
  • 5
    Если массив не содержит ключа, ваш код завершится бесконечным циклом. Вы должны проверить, не закончил ли указатель: while (key($List) !== $CurrentPage && key($List) !== null) next($List); – VaclavSir 4 September 2014 в 10:49

Используя приведенные ниже функции, вы можете получить следующие и предыдущие КЛЮЧИ массива. Если текущий ключ недействителен или это последний ( первый - для prev) [] в массиве, затем:

  • функция getNext (...) возвращает 0 (первый элемент key )
  • Функция getPrev (...) возвращает клавишу последнего элемента массива

Функции циклические.

function getNext(&$array, $curr_key)
{
    $next = 0;
    reset($array);

    do
    {
        $tmp_key = key($array);
        $res = next($array);
    } while ( ($tmp_key != $curr_key) && $res );

    if( $res )
    {
        $next = key($array);
    }

    return $next;
}

function getPrev(&$array, $curr_key)
{
    end($array);
    $prev = key($array);

    do
    {
        $tmp_key = key($array);
        $res = prev($array);
    } while ( ($tmp_key != $curr_key) && $res );

    if( $res )
    {
        $prev = key($array);
    }

    return $prev;
}
6
ответ дан Andrei 27 August 2018 в 04:33
поделиться
  • 1
    В getNextVal () есть ошибка. При объявлении $ next в строке 1 это должно быть $ next = reset ($ array) ;. В противном случае для последнего индекса вы получите 0 вместо 1-го индекса массива (циклический). – Shivaas 31 January 2011 в 12:01
  • 2
    @Shivaas, о котором вы упоминали, – Muk 25 April 2014 в 12:19
  • 3
    @Andrei Спасибо за хорошее решение – Muk 25 April 2014 в 12:50
  • 4
    Почему вы опубликовали два одинаковых ответа? Пожалуйста, удалите его. – mickmackusa 30 April 2017 в 12:00
  • 5
    Один ответ - для значений, другой - для ключей ... Действительно, их нужно объединить. – Gras Double 26 July 2017 в 06:03

Вот полный подход @tjunglc с циклом:

protected function getPrevNext($aArray,$key)
{
    $aKeys = array_keys($aArray); //every element of aKeys is obviously unique
    $aIndices = array_flip($aKeys); //so array can be flipped without risk
    $i = $aIndices[$key]; //index of key in aKeys
    if ($i > 0) $prev = $aArray[$aKeys[$i-1]]; //use previous key in aArray
    if ($i < count($aKeys)-1) $next = $aArray[$aKeys[$i+1]]; //use next key in aArray
    if (!isset($prev)) $prev = end($aArray);
    if (!isset($next)) $next = reset($aArray);
    return array($prev,$next);
}

Oh и thankx @tjunglc для этого:)

-1
ответ дан Blaž Oražem 27 August 2018 в 04:33
поделиться

Попробуйте это

 public function getNextVal(&$array, $curr_val){

    foreach($array as $k=>$v){
        if($v['your_key'] == $curr_val){
            if(isset($array[$k+1]))
                return $array[$k+1];
            else
                return $array[0];
        }
    }

}

public function getPrevVal(&$array, $curr_val){

    foreach($array as $k=>$v){
        if($v['your_key'] == $curr_val){
            if(isset($array[$k-1]))
                return $array[$k-1];
            else
                return end($array);
        }
    }
}

для массива следующим образом:

array (size=3)
0 => 
array (size=11)
  'id' => string '21' (length=2)
  'cat' => string '1' (length=1)
  'gal' => string '1' (length=1)
  'type' => string 'image' (length=5)
  'name' => string 'chalk_art_dies-irea_2nd_pic' (length=27)
  'permalink' => string 'chalk-art-dies-irea-2nd-pic' (length=27)
  'url' => string 'rxNsPoEiJboJQ32.jpg' (length=19)
  'content' => string '' (length=0)
  'date' => string '1432076359' (length=10)
  'order' => string '20' (length=2)
  'views' => string '0' (length=1)
 1 => 
   array (size=11)
  'id' => string '10' (length=2)
  'cat' => string '1' (length=1)
  'gal' => string '1' (length=1)
  'type' => string 'image' (length=5)
  'name' => string '3dchalkart' (length=10)
  'permalink' => string '3dchalkart' (length=10)
  'url' => string 's57i5DKueUEI4lu.jpg' (length=19)
  'content' => string '' (length=0)
  'date' => string '1432076358' (length=10)
  'order' => string '9' (length=1)
  'views' => string '0' (length=1)
  2 => 
0
ответ дан Burhan Ibrahimi 27 August 2018 в 04:33
поделиться

Я использую этот код для установки внутреннего указателя с ключом массива.

reset($List);
while (key($List) !== $id && key($List) !== null) next($List);
if(key($List) === null) end($List);

После этого вы можете использовать prev () или next ().

Обновить следующее уведомление из @VaclavSir

1
ответ дан EThaizone Jo 27 August 2018 в 04:33
поделиться
  • 1
    Конец массива лучше обнаруживается с помощью функции key: if(key($List) === null) end($List); Поскольку в массиве может быть значение false, но не может быть null в качестве ключа. – VaclavSir 4 September 2014 в 10:56
  • 2
    @VaclavSir Спасибо за отправную точку этой проблемы. Я обновлю его. – EThaizone Jo 26 September 2016 в 09:45

Внутренний указатель массива в основном используется для циклирования по массиву в пределах одного скрипта PHP. Я бы не рекомендовал использовать его для перехода со страницы на страницу.

Для этого просто отслеживайте номер страницы и размер страницы (количество элементов на странице). Затем, когда вы загружаете другую страницу, вы можете использовать их, чтобы определить, какие элементы массива должны отображаться. Например:

$pageNum = $_GET["pageNum"];
$pageSize = 10;
$startIndex = ($pageNum - 1) * $pageSize;
$endIndex = ($startIndex + $pageSize) - 1;

(или что-то подобное)

2
ответ дан JW. 27 August 2018 в 04:33
поделиться

другой подход без циклов или поиска.

list($prev,$next) = getPrevNext($oObjects,$sCurrentKey);

function getPrevNext($aArray,$key){
    $aKeys = array_keys($aArray); //every element of aKeys is obviously unique
    $aIndices = array_flip($aKeys); //so array can be flipped without risk
    $i = $aIndices[$key]; //index of key in aKeys
    if ($i > 0) $prev = $aArray[$aKeys[$i-1]]; //use previous key in aArray
    if ($i < count($aKeys)-1) $next = $aArray[$aKeys[$i+1]]; //use next key in aArray
    return array($prev,$next);
}
2
ответ дан tjungcl 27 August 2018 в 04:33
поделиться
  • 1
    if (! isset ($ prev)) $ prev = -1; if (! isset ($ next)) $ next = -1; добавление этих двух заявлений до возвращения даст больше точности – Nagaraju Badaeni 16 July 2012 в 08:13
Другие вопросы по тегам:

Похожие вопросы: