我發現當您有一個很大的陣列,並且您想知道一個給定的值是否在陣列中時,這個函式非常有用。實際上,在這種情況下,in_array 會變得相當慢,但是您可以反轉大的陣列,然後使用 isset 以更快速的方式獲得相同的結果。
(PHP 4, PHP 5, PHP 7, PHP 8)
array_flip — 交換陣列中所有鍵与其关联的值
array_flip() 會回傳一個鍵值反轉的 陣列,也就是說,array
的鍵會變成值,而值會變成鍵。
請注意,array
的值必須是有效的鍵,也就是說,它們必須是 整數 或 字串。如果值的類型錯誤,將會發出警告,並且該鍵值對*不會被包含在結果中*。
如果一個值出現多次,則最後一個鍵將會被用作其值,而其他所有鍵都會遺失。
array
要反轉的鍵值對陣列。
回傳反轉後的陣列。
範例 #1 array_flip() 範例
<?php
$input = array("oranges", "apples", "pears");
$flipped = array_flip($input);
print_r($flipped);
?>
上述範例將會輸出:
Array ( [oranges] => 0 [apples] => 1 [pears] => 2 )
範例 #2 array_flip() 範例:鍵值衝突
<?php
$input = array("a" => 1, "b" => 1, "c" => 2);
$flipped = array_flip($input);
print_r($flipped);
?>
上述範例將會輸出:
Array ( [1] => b [2] => c )
我發現當您有一個很大的陣列,並且您想知道一個給定的值是否在陣列中時,這個函式非常有用。實際上,在這種情況下,in_array 會變得相當慢,但是您可以反轉大的陣列,然後使用 isset 以更快速的方式獲得相同的結果。
當解析具有標題列的 CSV 檔案,但列的順序或存在可能會有所不同時,此函式很有用。
<?php
$f = fopen("file.csv", "r");
/* 將第一行(標題行)讀入一個陣列,然後翻轉它
讓鍵值成為欄位名稱,而值則成為
欄位索引。 */
$cols = array_flip(fgetcsv($f));
while ($line = fgetcsv($f))
{
// 現在我們可以像這樣引用 CSV 欄位:
$status = $line[$cols['OrderStatus']];
}
?>
我認為這樣比引用數字陣列索引更好。
當您翻轉關聯式陣列或數字索引陣列時,array_flip 會移除原始陣列中的重複值。 正如您可能預期的那樣,會遺失兩個重複值中較早出現的那個。
<?php
$a = array('one', 'two', 'one');
print_r($a);
$b = array_flip($a);
print_r($b);
?>
結果
array(3) {
[0] => string(3) "one"
[1] => string(3) "two"
[2] => string(3) "one"
}
array(2) {
'one' => int(2)
'two' => int(1)
}
這可能是好的或壞的,取決於您想要什麼,但不會拋出錯誤。
array_flip() 在將值轉換為鍵時,不會保留值的資料類型。 :(
<?php
$arr = array('one' => '1', 'two' => '2', 'three' => '3');
var_dump($arr);
$arr2 = array_flip($arr);
var_dump($arr2);
?>
這段程式碼輸出如下
array(3) {
["one"]=>
string(1) "1"
["two"]=>
string(1) "2"
["three"]=>
string(1) "3"
}
array(3) {
[1]=>
string(3) "one"
[2]=>
string(3) "two"
[3]=>
string(5) "three"
}
合理的預期是字串值 "1"、"2" 和 "3" 會變成字串鍵 "1"、"2" 和 "3"。
如果有人想知道 array_flip() 如何處理空陣列
<?php
print_r(array_flip(array()));
?>
結果為
Array
(
)
我想知道如果沒有鍵值對可以翻轉,它是否會返回 false 甚至拋出錯誤,儘管如果出現這種情況很不直觀。但(當然)一切都如預期般運作。只是給偏執狂提個醒。
當您執行 array_flip 時,它會為每個值取最後一次出現的鍵,但請注意,翻轉後陣列中的鍵順序將按照值在原始陣列中首次出現的順序排列。例如,陣列
[1] => 1
[2] => 2
[3] => 3
[4] => 3
[5] => 2
[6] => 1
[7] => 1
[8] => 3
[9] => 3
翻轉後會變成
(首次出現的值 -> 首次出現的鍵)
[1] => 7
[2] => 5
[3] => 9
而不是像這樣
(最後出現的值 -> 最後出現的鍵)
[2] => 5
[1] => 7
[3] => 9
在我的應用程式中,我需要找到五個最近評論的項目。我有一個排序好的 評論ID => 項目ID 陣列,我腦海中浮現的想法就是執行 array_flip($array),我以為現在陣列中會有最後五個項目作為最近評論的項目 => 評論對。事實並非如此(見上文,因為它是值的順序)。為了實現我需要的功能,我想出了以下方法(以防有人需要這樣做)
首先,我們需要一種方法來翻轉陣列,為陣列中的每個值取第一次遇到的鍵。您可以使用以下方法執行此操作
$array = array_flip(array_unique($array));
那麼,要實現「最新評論」的效果,只需執行
$array = array_reverse($array, true);
$array = array_flip(array_unique($array));
$array = array_reverse($array, true);
在最開始的例子中,陣列會變成
[2] => 5
[1] => 7
[3] => 9
正是我(也許也是你?)需要的。 =^_^=
我需要一種翻轉多維陣列的方法,並想出了這個函式來完成這個任務。我希望它能幫助其他人。
<?php
function multi_array_flip($arrayIn, $DesiredKey, $DesiredKey2=false, $OrigKeyName=false) {
$ArrayOut=array();
foreach ($arrayIn as $Key=>$Value)
{
// 如果需要將原始鍵值保留為新陣列中的資料,則在要求時執行此操作 ($OrigKeyName=true)
if ($OrigKeyName) $Value[$OrigKeyName]=$Key;
// 要求陣列資料部分中以 $DesiredKey 為鍵的字串值
if (!is_string($Value[$DesiredKey])) return false;
// 如果指定了 $DesiredKey2,則假設需要多維陣列並建構它
if (is_string($DesiredKey2))
{
// 要求陣列資料部分中以 $DesiredKey2 為鍵的字串值
if (!is_string($Value[$DesiredKey2])) return false;
// 建構新的多維陣列
$ArrayOut[$Value[$DesiredKey]][$Value[$DesiredKey2]]=$Value;
}
// 建構新的一維陣列
else $ArrayOut[$Value[$DesiredKey]][]=$Value;
}
return $ArrayOut;
}//multi_array_flip 結束
?>
不要使用此函數來過濾或搜尋陣列 - PHP 已經有專門用於這些目的的函數。除此之外,如果陣列的元素不是整數或非十進位整數字串,array_flip 會破壞它們。
同樣地,如果您想要取得最後一個值而不影響指標,您可以這樣做
<?php
$array = array("one","two","three");
echo next($array); // "two"
$last = array_pop(array_keys(array_flip($array)));
echo $last; // "three"
echo current($array); // "two"
?>
在陣列中尋找最長的字串?
<?php
function longest_string_in_array($array)
{
$mapping = array_combine($array, array_map('strlen', $array));
return array_keys($mapping, max($mapping));
}
?>
差異很明顯:返回一個包含[i]所有[/i]最長字串的陣列,而不是僅任意選擇一個。 不執行 stripslashing 或 magic 處理,因為那是另一個函式的職責。
從演算法效率的角度來看,構建一個完整的長度陣列然後排序以僅檢索最長的值是不必要的工作。以下程式碼應該是 O(n) 而不是 O(n log n)。它也可以是
<?php
function get_longest_value($array) {
// 有些人不喜歡初始化,但我喜歡
$longest = NULL;
$longestLen = -1;
foreach ($array as $value) {
$len = strlen($value);
if($len>$longestLen) {
$longest = $value;
$longestLen = $len;
}
}
$longest = str_replace("\r\n", "\n", $longest);
if (get_magic_quotes_gpc()) { return stripslashes($longest); }
return $longest;
}
?>
<?php
$arr = array('one' => ['four' => 4], 'two' => '2', 'three' => '3');
var_dump($arr);
$arr2 = array_flip($arr);
var_dump($arr2);
?>
上述範例將會輸出:
array(3) {
["one"]=>
array(1) {
["four"]=>
int(4)
}
["two"]=>
string(1) "2"
["three"]=>
string(1) "3"
}
警告:array_flip(): 只能翻轉字串和整數值! 於 /root/test.php 第 4 行
array(2) {
[2]=>
string(3) "two"
[3]=>
string(5) "three"
}
<?php
function array_flip_into_subarray($input){
$output = array();
foreach ($input as $key=>$values){
foreach ($values as $value){
$output[$value][] = $key;
}
}
return $output;
}
如果您不想遺失重複值,並且您可以接受翻轉後的陣列中的值也位於一個陣列中,您可以使用這個
PHP 7.4 - ^8
<?php
function array_flip_safe(array $array) : array
{
return array_reduce(array_keys($array), function ($carry, $key) use (&$array) {
$carry[$array[$key]] ??= [];
$carry[$array[$key]][] = $key;
return $carry;
}, []);
}
?>
PHP 7.0 - ^7.3(該升級到 PHP 8 了 ^^)
<?php
function array_flip_safe(array $array) : array
{
return array_reduce(array_keys($array), function ($carry, $key) use (&$array) {
$carry[$array[$key]] = $carry[$array[$key]] ?? [];
$carry[$array[$key]][] = $key;
return $carry;
}, []);
}
?>
PHP 5.4 - ^5.6(還是算了吧)
<?php
函式 array_flip_safe(陣列 $array)
{
返回 array_reduce(array_keys($array), 函式 ($carry, $key) use (&$array) {
如果 (!isset($carry[$array[$key]]))
$carry[$array[$key]] = [];
$carry[$array[$key]][] = $key;
返回 $carry;
}, []);
}
?>
註解 :: array_flip 會交換鍵值,並像 array_unique 一樣自動去重複
<?php
/*
sabastore
*/
$intArray1 = 陣列(-4,1,1,3);
print_r($intArray1);
$intArray1 = array_flip($intArray1);
print_r($intArray1);
?>