array_flip

(PHP 4, PHP 5, PHP 7, PHP 8)

array_flip交换数组中所有键与其关联的值

描述

array_flip(array $array): array

array_flip() 返回一个反转顺序的 array,即来自 array 的键变为值,来自 array 的值变为键。

请注意,array 的值需要是有效的键,即它们需要是 intstring。如果值类型错误,将发出警告,并且该键值对将不会包含在结果中

如果一个值出现多次,将使用最新的键作为其值,所有其他键将丢失。

参数

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
)

参见

添加注释

用户贡献注释 19 个注释

Final
12 年前
当您有一个大型数组并想要知道某个给定值是否在数组中时,我发现此函数非常有用。实际上,在这种情况下的 in_array 速度非常慢,但您可以反转大型数组,然后使用 isset 获得相同的结果,速度快得多。
Tony H
11 年前
当解析带有标题列的 CSV 文件时,此函数很有用,但列的顺序或存在可能会变化

<?php

$f
= fopen("file.csv", "r");

/* 将第一行(标题)放入数组,然后反转它
以便键是列名,值是
列索引。 */
$cols = array_flip(fgetcsv($f));

while (
$line = fgetcsv($f))
{
// 现在我们可以像这样引用 CSV 列:
$status = $line[$cols['OrderStatus']];
}

?>

我认为这比引用数字数组索引要好。
Bob Ray
7 年前
当您反转关联数组或数字数组时,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)
}

这可能是好是坏,取决于您想要什么,但不会抛出错误。
Prabhas Gupte
9 年前
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"。
pinkgothic at gmail dot com
17 年前
如果有人想知道 array_flip() 如何处理空数组

<?php
print_r
(array_flip(array()));
?>

结果是

Array
(
)

我想知道它是否会返回 false 以及/或者即使没有键值对要翻转也会抛出错误,尽管如果那样的话,这并不直观。但(当然)一切按预期工作。只是提醒一下那些患有妄想症的人。
snaury at narod dot ru
19 年前
当您执行 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

在我的应用程序中,我需要找到五个最近评论的条目。我有一个排序的 comment-id => entry-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

这正是我(也许还有你?)需要的。=^_^=
kjensen at iaff106 dot com
12 年前
我需要一种方法来翻转多维数组,并想出了这个函数来完成这项任务。我希望它能帮助其他人。

<?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
?>
Hayley Watson
6 年前
不要使用此函数来过滤或搜索数组 - PHP 已经有了专门用于这些目的的函数。如果实在不行,array_flip 会将数组中的元素全部丢弃,除非它们是整数或非小数整数字符串。
Anonymous
12 年前
同样,如果你想获取最后一个值而不影响指针,你可以这样做

<?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"

?>
dash
5 年前
注意:array_flip 可以将字符串转换为整数
Hayley Watson
15 年前
查找数组中最长的字符串?

<?php
function longest_string_in_array($array)
{
$mapping = array_combine($array, array_map('strlen', $array));
return
array_keys($mapping, max($mapping));
}
?>

差异很明显:返回一个包含[i]所有[/i]最长字符串的数组,而不是随机选择一个。它不执行斜杠去除或魔法操作,因为那是另一个函数的任务。
dan at aoindustries dot com
15 年前
从算法效率的角度来看,构建一个完整的长度数组,然后排序只为了检索最长的值,这是不必要的操作。以下应该为 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;
}
?>
Ahammar Yassine
5 年前
<?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"
}

Warning: array_flip(): Can only flip STRING and INTEGER values! in /root/test.php on line 4
array(2) {
[2]=>
string(3) "two"
[3]=>
string(5) "three"
}
grimdestripador at hotmail dot com
10 年前
<?php
function array_flip_into_subarray($input){
$output = array();
foreach (
$input as $key=>$values){
foreach (
$values as $value){
$output[$value][] = $key;
}
}
return
$output;
}
mmulej at gmail dot com
2 年前
如果你不想丢失重复项,并且你对在翻转后的数组中也拥有值的数组感到满意,你可以使用这个

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;
}, []);
}

?>
znailz at yahoo dot com
21 年前
我知道很多人想要一个函数,可以从数组中根据值移除键。我看到了一些解决方案,它们通过遍历整个数组,逐个比较值,然后取消设置该值的键。PHP 几乎对所有事情都有内置函数(听说它甚至可以为你做早餐),所以如果你想“如果 PHP 有一个函数来做这件事,那该有多酷”,很可能它已经有了。看看这个例子。它接受一个值,获取该值的所以键(如果它有重复值),取消设置所有键,然后返回一个重新索引的数组。

<?php
$arr
= array(11,12,13,12); // 示例数组
$arr = array_flip($arr);
unset(
$arr[12]);
$arr = array(array_keys($arr));
?>

$arr 包含

Array
(
[0] => 数组
(
[0] => 11
[1] => 13
)
?>

)
h3x
13 年前
此函数可用于从数组中移除空元素

<?php
$ar
= array(null,'1','2',null,'3',null);
print_r($ar);
/*
结果:
数组
(
[0] =>
[1] => 1
[2] => 2
[3] =>
[4] => 3
[5] =>
)
*/

print_r(array_flip(array_flip($ar)));
/*
结果:
数组
(
[1] => 1
[2] => 2
[4] => 3
)
*/
?>
info at sabastore dot net
8 年前
注意:array_flip 会改变键和值,并且会自动去重,类似于 array_unique

<?php
/*
sabastore
*/
$intArray1 = array(-4,1,1,3);
print_r($intArray1);
$intArray1 = array_flip($intArray1);
print_r($intArray1);
?>
corz at corz dot org
15 年前
<?php
/*
用于返回数组中最长物理*值*的有趣函数。

从一个用于捕获最长 $_POST 变量的小脚本中提取,
通常是 textarea,然后会将其转储到一个“紧急帖子转储文件”中。

corz at corz dot org
*/

$array = array("input" => "submit", "textarea" => "Some long spiel of text\r\na textarea, probably",
"another-input" => "make me longer", "and" => "another", "etc" => "etc.");

echo
'<!DOCTYPE HTML SYSTEM><html><head><title>long</title></head><body><pre>Longest value: ',
get_longest_value($array),'</pre></body></html>';

function
get_longest_value($array) {
foreach (
$array as $key => $value) {
$lengths[$key] = strlen($value);
}
asort($lengths);
$lengths = array_flip($lengths);
$longest = str_replace("\r\n", "\n", $array[array_pop($lengths)]);
if (
get_magic_quotes_gpc()) { return stripslashes($longest); }
return
$longest;
}
?>
To Top