我发现这个函数在您有一个大型数组并且想要知道给定值是否在数组中时非常有用。事实上,in_array 在这种情况下变得相当慢,但是您可以翻转大型数组,然后使用 isset 以更快的方式获得相同的结果。
(PHP 4, PHP 5, PHP 7, PHP 8)
array_flip — 交换数组中所有键与其关联的值
array_flip() 返回一个反转顺序的 数组,即 array
中的键变成值,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);
?>
结果
数组(3) {
[0] => 字符串(3) "one"
[1] => 字符串(3) "two"
[2] => 字符串(3) "one"
}
数组(2) {
'one' => 整数(2)
'two' => 整数(1)
}
这可能是好是坏,取决于您想要什么,但不会抛出错误。
array_flip() 在将值转换为键时不会保留值的数据类型。 :(
<?php
$arr = array('one' => '1', 'two' => '2', 'three' => '3');
var_dump($arr);
$arr2 = array_flip($arr);
var_dump($arr2);
?>
此代码输出以下内容
数组(3) {
["one"]=>
字符串(1) "1"
["two"]=>
字符串(1) "2"
["three"]=>
字符串(1) "3"
}
数组(3) {
[1]=>
字符串(3) "one"
[2]=>
字符串(3) "two"
[3]=>
字符串(5) "three"
}
合乎逻辑的期望是字符串值“1”、“2”和“3”将成为字符串键“1”、“2”和“3”。
如果有人想知道 array_flip() 如何处理空数组
<?php
print_r(array_flip(array()));
?>
结果是
数组
(
)
我想知道如果没有任何键值对需要翻转,它是否会返回 false 和/或抛出错误,尽管在这种情况下不直观。但是(当然)一切按预期工作。只是提醒一下那些疑神疑鬼的人。
当你使用 array_flip 时,它会获取每个值的最后一个键出现位置,但请注意,翻转后的数组中的键顺序将是值在原始数组中首次出现时的顺序。例如,数组
[1] => 1
[2] => 2
[3] => 3
[4] => 3
[5] => 2
[6] => 1
[7] => 1
[8] => 3
[9] => 3
翻转后将变成
(首次出现的 value -> 第一个 key)
[1] => 7
[2] => 5
[3] => 9
而不是像这样
(最后出现的 value -> 最后一个 key)
[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;
}//end 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]最长字符串的数组,而不是仅仅任意选择一个。不执行反斜杠或魔术操作,因为那是另一个函数的工作。
从算法效率的角度来看,构建一个完整的长度数组然后排序以仅检索最大值是不必要的额外工作。以下代码应该是 O(n) 而不是 O(n log n)。它还可以是
<?php
function get_longest_value($array) {
// 有些人不喜欢初始化,我习惯了
$longest = NULL;
$longestLen = -1;
foreach ($array $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);
?>
以上示例将输出
数组(3) {
["one"]=>
数组(1) {
["four"]=>
int(4)
}
["two"]=>
字符串(1) "2"
["three"]=>
字符串(1) "3"
}
警告:array_flip(): 只能翻转字符串和整数类型的值! in /root/test.php on line 4
数组(2) {
[2]=>
字符串(3) "two"
[3]=>
字符串(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
function array_flip_safe(array $array)
{
return array_reduce(array_keys($array), function ($carry, $key) use (&$array) {
if (!isset($carry[$array[$key]])
$carry[$array[$key]] = [];
$carry[$array[$key]][] = $key;
return $carry;
}, []);
}
?>
注意 :: array_flip 用于交换键和值,并类似 array_unique 自动去重
<?php
/*
sabastore
*/
$intArray1 = array(-4,1,1,3);
print_r($intArray1);
$intArray1 = array_flip($intArray1);
print_r($intArray1);
?>