Найдите последний элемент массива при использовании цикла foreach в PHP

Документация ARM для Cortex-A15 MPCore (с ~ 2012 г.) говорит, что она использует 32-битную гранулярность ECC в L1d и фактически выполняет слово-RMW для узких хранилищ для обновления данных. [ 112]

Кэш данных L1 поддерживает необязательную однобитовую корректную и двухбитную логику исправления ошибок в массивах тегов и данных. Гранулярность ECC для массива тегов - это тег для отдельной строки кэша, а гранулярность ECC для массива данных - это 32-разрядное слово.

Из-за гранулярности ECC в массиве данных запись в массив не может обновить часть 4-байтовой выровненной ячейки памяти, потому что недостаточно информации для вычисления нового значения ECC. Это относится к любой инструкции сохранения, которая не записывает одну или несколько выровненных 4-байтовых областей памяти. В этом случае система памяти данных L1 считывает существующие данные в кеше, объединяет модифицированные байты и вычисляет ECC на основе объединенного значения. Система памяти L1 пытается объединить несколько хранилищ вместе, чтобы соответствовать выровненной 4-байтовой гранулярности ECC и избежать требования чтения-изменения-записи.

blockquote>

(Когда они говорят «система памяти L1», я думаю, что они имеют в виду буфер хранения, если у вас есть смежные хранилища байтов, которые еще не фиксировали в L1d.)


[116 ] Я стою исправлено. Может быть штраф за узкие магазины на некоторых не x86 процессорах.

Cortex-A15 MPCore представляет собой трехпроцессорный исполняющий процессор, работающий не по порядку, так что это не минимальная мощность / простая схема ARM, но они решили тратить транзисторы на OoO exec, но не эффективный байт магазины.

По-видимому, без необходимости поддерживать эффективные невыровненные хранилища (которые программное обеспечение для x86 будет более вероятно принимать / использовать в своих интересах), более медленные хранилища байтов считались оправданными для более высокой надежности ECC для L1d без чрезмерных накладных расходов.

Cortex-A15, вероятно, не единственное и не самое последнее ядро ​​ARM, работающее таким образом.

198
задан Thamilan 7 June 2016 в 19:14
поделиться

12 ответов

Это кажется на желание чего-то вроде этого:

$numItems = count($arr);
$i = 0;
foreach($arr as $key=>$value) {
  if(++$i === $numItems) {
    echo "last index!";
  }
}    

Однако Вы не делаете-have-для итерации по "массиву" с помощью foreach в php.

288
ответ дан hakre 23 November 2019 в 05:10
поделиться

можно провести подсчет ().

for ($i=0;$i<count(arr);$i++){
    $i == count(arr)-1 ? true : false;
}

или если Вы ищете ТОЛЬКО последний элемент, можно использовать конец ().

end(arr);

возвраты только последний элемент.

и, как оказалось, Вы индекс CAN php выстраивает целыми числами. Это совершенно довольно

arr[1];
1
ответ дан helloandre 23 November 2019 в 05:10
поделиться

Можно все еще использовать тот метод с ассоциативными массивами:

$keys = array_keys($array);
for ($i = 0, $l = count($array); $i < $l; ++$i) {
    $key = $array[$i];
    $value = $array[$key];
    $isLastItem = ($i == ($l - 1));
    // do stuff
}

// or this way...

$i = 0;
$l = count($array);
foreach ($array as $key => $value) {
    $isLastItem = ($i == ($l - 1));
    // do stuff
    ++$i;
}
3
ответ дан nickf 23 November 2019 в 05:10
поделиться

При настраивании достигает 0, это означает, что это при последнем повторении цикла.

$toEnd = count($arr);
foreach($arr as $key=>$value) {
  if (0 === --$toEnd) {
    echo "last index! $value";
  }
}

последнее значение все еще доступно после цикла, поэтому если Вы просто хотите использовать его для большего количества материала после цикла, это лучше:

foreach($arr as $key=>$value) {
  //something
}
echo "last index! $key => $value";

, Если Вы не хотите рассматривать последнее значение как специальные внутренние циклы. Это должно быть быстрее, если у Вас есть большие массивы. (При многократном использовании массива после цикла в том же объеме, необходимо "скопировать" массив сначала).

//If you use this in a large global code without namespaces or functions then you can copy the array like this:
//$array = $originalArrayName; //uncomment to copy an array you may use after this loop

//end($array); $lastKey = key($array); //uncomment if you use the keys
$lastValue = array_pop($array);

//do something special with the last value here before you process all the others?
echo "Last is $lastValue", "\n";

foreach ($array as $key => $value) {
    //do something with all values before the last value
    echo "All except last value: $value", "\n";
}

//do something special with the last value here after you process all the others?
echo "Last is $lastValue", "\n";

И отвечать на Ваш исходный вопрос "в моем случае для добавления или/и параметр при создании запроса"; это циклично выполнится по всем значениям, затем присоединится к ним вместе к строке с "и" между ними, но не перед первым значением или после последнего значения:

$params = [];
foreach ($array as $value) {
    $params[] = doSomething($value);
}
$parameters = implode(" and ", $params);
23
ответ дан OIS 23 November 2019 в 05:10
поделиться

Вы могли получить значение последнего ключа массива с помощью end(array_keys($array)) и сравнить его с текущим ключом:

$last_key = end(array_keys($array));
foreach ($array as $key => $value) {
    if ($key == $last_key) {
        // last element
    } else {
        // not last element
    }
}
196
ответ дан Jeremy Ruten 23 November 2019 в 05:10
поделиться

Вы могли также сделать что-то вроде этого:

end( $elements );
$endKey = key($elements);
foreach ($elements as $key => $value)
{
     if ($key == $endKey) // -- this is the last item
     {
          // do something
     }

     // more code
}
1
ответ дан KOGI 23 November 2019 в 05:10
поделиться

Если я вас понимаю, то все, что вам нужно, это перевернуть массив и получить последний элемент командой pop:

   $rev_array = array_reverse($array);

   echo array_pop($rev_array);
0
ответ дан 23 November 2019 в 05:10
поделиться

чтобы получить первый и последний элемент из массива foreach

foreach($array as $value) {
    if ($value === reset($array)) {
        echo 'FIRST ELEMENT!';
    }

    if ($value === end($array)) {
        echo 'LAST ITEM!';
    }
}
1
ответ дан 23 November 2019 в 05:10
поделиться

Вот еще один способ сделать это:

$arr = range(1, 10);

$end = end($arr);
reset($arr);

while( list($k, $v) = each($arr) )
{
    if( $n == $end )
    {
        echo 'last!';
    }
    else
    {
        echo sprintf('%s ', $v);
    }
}
0
ответ дан 23 November 2019 в 05:10
поделиться

почему так сложно?

foreach($input as $key => $value) {
    $ret .= "$value";
    if (next($input)==true) $ret .= ",";
}

Это добавит символ после каждого значения, кроме последнего!

40
ответ дан 23 November 2019 в 05:10
поделиться

Если вам нужно сделать что-то для каждого элемента, кроме первого или последнего, и только если в массиве более одного элемента, я предпочитаю следующее решение.

Я знаю, что есть много решений выше и опубликовано на месяц / год раньше моего, но это то, что я считаю довольно элегантным само по себе. Проверка каждого цикла также является логической проверкой в ​​отличие от числовой проверки «i = (count-1)», которая может снизить накладные расходы.

Структура цикла может показаться неудобной, но вы можете сравнить ее с порядком следования thead (начало), tfoot (конец), tbody (текущий) в тегах таблицы HTML.

$first = true;
foreach($array as $key => $value) {
    if ($first) {
        $first = false;
        // Do what you want to do before the first element
        echo "List of key, value pairs:\n";
    } else {
        // Do what you want to do at the end of every element
        // except the last, assuming the list has more than one element
        echo "\n";
    }
    // Do what you want to do for the current element
    echo $key . ' => ' . $value;
}

Например, с точки зрения веб-разработки, если вы хотите добавить нижнюю границу к каждому элементу, кроме последнего в неупорядоченном списке (ul), то вместо этого вы можете добавить границу -top для каждого элемента, кроме первого (CSS: first-child, поддерживаемый IE7 + и Firefox / Webkit, поддерживает эту логику, тогда как: last-child не поддерживается IE7).

Вы можете свободно повторно использовать переменную $ first для каждого вложенного цикла, и все будет работать нормально, поскольку каждый цикл делает $ first ложным во время первого процесса первой итерации (так что прерывания / исключения не будут вызвать проблемы).

$first = true;
foreach($array as $key => $subArray) {
    if ($first) {
        $string = "List of key => value array pairs:\n";
        $first = false;
    } else {
        echo "\n";
    }

    $string .= $key . '=>(';
    $first = true;
    foreach($subArray as $key => $value) {
        if ($first) {
            $first = false;
        } else {
            $string .= ', ';
        }
        $string .= $key . '=>' . $value;
    }
    $string .= ')';
}
echo $string;

Пример вывода:

List of key => value array pairs:
key1=>(v1_key1=>v1_val1, v1_key2=>v1_val2)
key2=>(v2_key1=>v2_val1, v2_key2=>v2_val2, v2_key3=>v2_val3)
key3=>(v3_key1=>v3_val1)
4
ответ дан 23 November 2019 в 05:10
поделиться

Как насчет использования "end"? http://php.net/manual/en/function.end.php

1
ответ дан 23 November 2019 в 05:10
поделиться
Другие вопросы по тегам:

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