PHP Conference Japan 2024

上一個

(PHP 4、PHP 5、PHP 7、PHP 8)

prev倒回陣列的內部指標

說明

prev(array|object &$array): mixed

倒回陣列的內部指標。

prev() 的行為就像 next(),除了它是將內部陣列指標往回移動一個位置,而不是往前移動。

參數

array

輸入的陣列。

回傳值

回傳內部陣列指標所指向的前一個位置的陣列值,如果沒有更多元素,則回傳 false

警告

此函數可能回傳布林值 false,但也可能回傳一個非布林值,其計算結果為 false。請閱讀關於布林值的章節以取得更多資訊。使用 === 運算子來測試此函數的回傳值。

變更日誌

版本 說明
8.1.0 object 上呼叫此函數已棄用。請先使用 get_mangled_object_vars()object 轉換為 array,或使用實作 Iterator 的類別所提供的方法,例如 ArrayIterator
7.4.0 SPL 類別的實例現在被視為沒有屬性的空物件,而不是呼叫與此函數同名的 Iterator 方法。

範例

範例 #1 使用 prev() 和其他相關函數的範例

<?php
$transport
= array('foot', 'bike', 'car', 'plane');
$mode = current($transport); // $mode = 'foot';
$mode = next($transport); // $mode = 'bike';
$mode = next($transport); // $mode = 'car';
$mode = prev($transport); // $mode = 'bike';
$mode = end($transport); // $mode = 'plane';
?>

注意事項

注意 陣列的開頭與 bool false 元素無法區分。為了區分,請檢查 prev() 元素的 key() 是否為 null

另請參閱

  • current() - 回傳陣列中的目前元素
  • end() - 將陣列的內部指標設定為最後一個元素
  • next() - 將陣列的內部指標往前移動
  • reset() - 將陣列的內部指標設定為第一個元素
  • each() - 從陣列回傳目前的鍵和值配對,並往前移動陣列游標

新增註解

使用者貢獻的註解 3 則註解

0
MicroVB INC
10 年前
此函數會依鍵值在陣列中搜尋最接近的元素,並回傳鍵/值配對,如果找不到則回傳 false。

<?php
function nearest($array, $value, $exact=false) {
// 初始化變數
$next = false;
$prev = false;
$return = false;

if(!isset(
$array[$value]) && !$exact) {
// 插入不存在的元素以便找到最接近的值
$array[$value] = '-';
}

if(
$exact && isset($array[$value])) {
// 如果找到完全匹配,且搜尋的是完全匹配(而非最接近的值),則回傳結果。
$return = Array($value=>$array[$value]);
} else {
// 排序陣列,使插入的記錄接近相關的數值
ksort($array); // 依鍵值排序陣列

// 迴圈遍歷陣列直到找到匹配的值,然後將 $prev 和 $next 設定為對應的鍵(如果存在)
while ( !is_null($key = key($array)) ) {
$val = current($array);
if(
$key == $value) {
prev($array); // 取得此項目的前一項目
$prev = key($array);
next($array); // 跳過目前項目,因為這是我們要尋找最接近值的目標
next($array); // 取得此項目之後的項目
$next = key($array);
break;
}
next($array);
}

if(
$prev && $next) {
if((
$long - $prev) > ($next - $long)) {
// 前一個值較接近
$return = Array($prev=>$array[$prev]);
} else {
// 後一個值較接近
$return = Array($next=>$array[$next]);
}
} elseif (
$prev || $next) {
if(
$prev) {
// 只有前一個值存在
$return = Array($prev=>$array[$prev]);
} elseif (
$next) {
// 只有後一個值存在
$return = Array($next=>$array[$next]);
}
}
}

// 回傳結果陣列。如果沒有任何值符合最接近條件,或指定完全匹配且鍵值不存在,$return 會是 false。
return $return;
}
?>

使用範例(在陣列中查找最接近的顏色)
<?php
$mycolors
= Array(
5001046=>'Abbey',
1774596=>'Acadia',
8171681=>'Acapulco',
6970651=>'Acorn',
13238245=>'Aero Blue',
7423635=>'Affair',
8803850=>'Afghan Tan',
13943976=>'Akaroa',
16777215=>'Alabaster',
16116179=>'Albescent White',
10176259=>'Alert Tan',
30371=>'Allports'
);

// 要搜尋的顏色(十六進位)
$color = 'C0C0C0';

// 將十六進位轉換為長整數,以便與 array() 的鍵值比較
$colorlong = base_convert($color,16,10);

// 檢查是否有完全匹配
$result = nearest($mycolors, $colorlong, true);
if(
$result) {
echo
"找到 # " . $color . " 的完全匹配,名稱為 '" . $result[key($result)] . "'";
} else {
echo
"找不到完全匹配的值";
}

if(!
$result) {
// 檢查是否有最接近的匹配
$result = nearest($mycolors, $colorlong, true);
if(
$result) {
// 找到匹配
echo "與 # " . $color . " 最接近的匹配是 # " . base_convert(key($result),10,16) . ",名稱為 '" . $result[key($result)] . "'";
} else {
// 找不到匹配
echo "找不到 # " . $color " 的匹配";
}
}
?>
-1
soapergem at gmail dot com
15 年前
這是對 xmlich02 反向迭代範例的稍微修改。他/她的範例問題在於,如果任何陣列元素是布林值 false,則會停止,而此版本不會。

<?php

end
($ar);
while ( !
is_null($key = key($ar)) ) {
$val = current($ar);
echo
"{$key} => {$val}\n";
prev($ar);
}

?>
-2
Mikhail
5 年前
取得陣列中位於鍵值之前的元素,如果該鍵值不存在或該鍵值不在陣列中,則回傳 false 的函式。

<?php

function previousElement(array $array, $currentKey)
{
if (!isset(
$array[$currentKey])) {
return
false;
}
end($array);
do {
$key = array_search(current($array), $array);
$previousElement = prev($array);
}
while (
$key != $currentKey);

return
$previousElement;
}
To Top