Документация 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, работающее таким образом.
Это кажется на желание чего-то вроде этого:
$numItems = count($arr);
$i = 0;
foreach($arr as $key=>$value) {
if(++$i === $numItems) {
echo "last index!";
}
}
Однако Вы не делаете-have-для итерации по "массиву" с помощью foreach
в php.
можно провести подсчет ().
for ($i=0;$i<count(arr);$i++){
$i == count(arr)-1 ? true : false;
}
или если Вы ищете ТОЛЬКО последний элемент, можно использовать конец ().
end(arr);
возвраты только последний элемент.
и, как оказалось, Вы индекс CAN php выстраивает целыми числами. Это совершенно довольно
arr[1];
Можно все еще использовать тот метод с ассоциативными массивами:
$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;
}
При настраивании достигает 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);
Вы могли получить значение последнего ключа массива с помощью 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
}
}
Вы могли также сделать что-то вроде этого:
end( $elements );
$endKey = key($elements);
foreach ($elements as $key => $value)
{
if ($key == $endKey) // -- this is the last item
{
// do something
}
// more code
}
Если я вас понимаю, то все, что вам нужно, это перевернуть массив и получить последний элемент командой pop:
$rev_array = array_reverse($array);
echo array_pop($rev_array);
чтобы получить первый и последний элемент из массива foreach
foreach($array as $value) {
if ($value === reset($array)) {
echo 'FIRST ELEMENT!';
}
if ($value === end($array)) {
echo 'LAST ITEM!';
}
}
Вот еще один способ сделать это:
$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);
}
}
почему так сложно?
foreach($input as $key => $value) {
$ret .= "$value";
if (next($input)==true) $ret .= ",";
}
Это добавит символ после каждого значения, кроме последнего!
Если вам нужно сделать что-то для каждого элемента, кроме первого или последнего, и только если в массиве более одного элемента, я предпочитаю следующее решение.
Я знаю, что есть много решений выше и опубликовано на месяц / год раньше моего, но это то, что я считаю довольно элегантным само по себе. Проверка каждого цикла также является логической проверкой в отличие от числовой проверки «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)
Как насчет использования "end"? http://php.net/manual/en/function.end.php