天道酬勤,学无止境

不区分大小写的array_unique(case-insensitive array_unique)

问题

我试图写几行代码以使不区分大小写的数组唯一类型函数。 这是我到目前为止的内容:

foreach ($topics as $value) {
    $lvalue = strtolower($value);
    $uvalue = strtolower($value);

    if (in_array($value, $topics) == FALSE || in_array($lvalue, $topics) == FALSE || in_array($uvalue, $topics) == FALSE) {
        array_push($utopics, $value);
    }
}

麻烦的是if语句。 我认为我的语法有问题,但是我对PHP还是比较陌生,我不确定它是什么。 有什么帮助吗?

回答1
function array_iunique( $array ) {
    return array_intersect_key(
        $array,
        array_unique( array_map( "strtolower", $array ) )
    );
}
回答2

您要将lvalueuvalue lvalue都设置为小写版本。

 $uvalue = strtolower($value);

应该

 $uvalue = strtoupper($value);

也就是说,这可能会更快一些。 您的函数的性能将呈指数级下降,而这或多或少是线性的(猜测,不是comp-sci major ...)

<?php

function array_iunique($ar) {
  $uniq = array();
  foreach ($ar as $value)
    $uniq[strtolower($value)] = $value;
  return array_values($uniq);
}
?>
回答3

$ uvalue不应该大写吗? 所以

$uvalue = strtoupper($value):
回答4

还有另一种选择

function array_iunique($topics) {

    $ltopics = array_map('strtolower', $topics);
    $cleanedTopics = array_unique($ltopics);

    foreach($topics as $key => $value) {
        if(!isset($cleanedTopics[$key])) {
            unset($topics[$key]);
        }
    }

    return $topics;

}

奔腾10的更好。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • case-insensitive array_unique
    I'm trying to write a few lines of code to make a case insensitive array unique type function. Here's what I have so far: foreach ($topics as $value) { $lvalue = strtolower($value); $uvalue = strtolower($value); if (in_array($value, $topics) == FALSE || in_array($lvalue, $topics) == FALSE || in_array($uvalue, $topics) == FALSE) { array_push($utopics, $value); } } The trouble is the if statement. I think there's something wrong with my syntax, but I'm relatively new to PHP and I'm not sure what it is. Any help?
  • 如何从PHP中的数组中删除重复的值(How to remove duplicate values from an array in PHP)
    问题 如何从PHP中的数组中删除重复的值? 回答1 使用array_unique()。 例子: $array = array(1, 2, 2, 3); $array = array_unique($array); // Array is now (1, 2, 3) 回答2 使用array_values(array_unique($array)); array_unique :用于唯一数组array_values :用于重新索引 回答3 //Find duplicates $arr = array( 'unique', 'duplicate', 'distinct', 'justone', 'three3', 'duplicate', 'three3', 'three3', 'onlyone' ); $unique = array_unique($arr); $dupes = array_diff_key( $arr, $unique ); // array( 5=>'duplicate', 6=>'three3' 7=>'three3' ) // count duplicates array_count_values($dupes); // array( 'duplicate'=>1, 'three3'=>2 ) 回答4 唯一对我有用的是: $array = array
  • 如何从PHP中的多维数组中删除重复的值(How to remove duplicate values from a multi-dimensional array in PHP)
    问题 如何从PHP的多维数组中删除重复的值? 数组示例: Array ( [0] => Array ( [0] => abc [1] => def ) [1] => Array ( [0] => ghi [1] => jkl ) [2] => Array ( [0] => mno [1] => pql ) [3] => Array ( [0] => abc [1] => def ) [4] => Array ( [0] => ghi [1] => jkl ) [5] => Array ( [0] => mno [1] => pql ) ) 回答1 这是另一种方式。 不保存任何中间变量。 我们使用它来删除来自各种重叠查询的结果。 $input = array_map("unserialize", array_unique(array_map("serialize", $input))); 回答2 从5.2.9开始,如果您使用SORT_REGULAR标志,则可以使用array_unique(), SORT_REGULAR所示: array_unique($array, SORT_REGULAR); 这使函数可以像使用$a == $b一样比较元素是否相等,这对于您的情况而言是完美的。 输出 Array ( [0] => Array ( [0] => abc [1] => def ) [1
  • array_unique,然后重新编号键(array_unique and then renumbering keys [duplicate])
    问题 这个问题已经在这里有了答案: 8年前关闭。 可能重复: 重新索引数字数组键 我有一个数组如下 Array ( [0] => 15/11/2012 - 18/11/2012 [1] => 15/11/2012 - 18/11/2012 [2] => 15/11/2012 - 18/11/2012 [3] => 15/11/2012 - 18/11/2012 [4] => 19/12/2012 - 24/12/2012 [5] => 24/12/2012 - 01/01/2013 [6] => 24/12/2012 - 01/01/2013 [7] => 16/01/2013 - 01/02/2013 ) 我正在使用array_unique删除给我的重复项 Array ( [0] => 15/11/2012 - 18/11/2012 [4] => 19/12/2012 - 24/12/2012 [5] => 24/12/2012 - 01/01/2013 [7] => 16/01/2013 - 01/02/2013 ) 我如何更改按键,使它们连续-如下 Array ( [0] => 15/11/2012 - 18/11/2012 [1] => 19/12/2012 - 24/12/2012 [2] => 24/12/2012 - 01/01/2013 [3] => 16/01
  • 如何在多维数组中获得唯一值(How to get unique value in multidimensional array)
    问题 我已经在溢出和Google上做了大量的工作,但是没有任何结果适用于我的特定情况。 我有一个名为$ holder的占位符数组,值如下: Array ( [0] => Array ( [id] => 1 [pid] => 121 [uuid] => 1 ) [1] => Array ( [id] => 2 [pid] => 13 [uuid] => 1 ) [2] => Array ( [id] => 5 [pid] => 121 [uuid] => 1 ) ) 我正在尝试从此多维数组中提取不同/唯一的值。 我想要的最终结果是一个包含(13,121)的变量,或者是(最好是)如下所示的数组:Array([0] => 13 [1] => 121) 再次,我尝试了序列化等,但是当在每个数组中使用单个键进行操作时,我不太了解它是如何工作的。 我试图尽可能清楚。 我希望这是有道理的... 回答1 似乎很简单:将所有pid值提取到它们自己的数组中,然后通过array_unique运行它: $uniquePids = array_unique(array_map(function ($i) { return $i['pid']; }, $holder)); 从长远来看同样的事情: $pids = array(); foreach ($holder as $h) { $pids[] = $h[
  • 如何检测PHP数组中的重复值?(How to detect duplicate values in PHP array?)
    问题 我正在使用PHP中的一维数组。 我想检测重复值的存在,然后计算重复值的数量并输出结果。 例如,给定以下数组: $array = array('apple', 'orange', 'pear', 'banana', 'apple', 'pear', 'kiwi', 'kiwi', 'kiwi'); 我想打印: apple (2) orange pear (2) banana kiwi (3) 关于如何解决这个问题有什么建议吗? 谢谢。 麦克风 回答1 您可以使用array_count_values函数 $array = array('apple', 'orange', 'pear', 'banana', 'apple', 'pear', 'kiwi', 'kiwi', 'kiwi'); print_r(array_count_values($array)); 将输出 Array ( [apple] => 2 [orange] => 1 [pear] => 2 etc... ) 回答2 if(count(array_unique($array))<count($array)) { // Array has duplicates } else { // Array does not have duplicates } 回答3 function array_not_unique(
  • How do I use array_unique on an array of arrays?
    I have an array Array( [0] => Array ( [0] => 33 [user_id] => 33 [1] => 3 [frame_id] => 3 ) [1] => Array ( [0] => 33 [user_id] => 33 [1] => 3 [frame_id] => 3 ) [2] => Array ( [0] => 33 [user_id] => 33 [1] => 8 [frame_id] => 8 ) [3] => Array ( [0] => 33 [user_id] => 33 [1] => 3 [frame_id] => 3 ) [4] => Array ( [0] => 33 [user_id] => 33 [1] => 3 [frame_id] => 3 ) ) As you can see key 0 is the same as 1, 3 and 4. And key 2 is different from them all. When running the array_unique function on them, the only left is Array ( [0] => Array ( [0] => 33 [user_id] => 33 [1] => 3 [frame_id] => 3 ) ) Any
  • array_unique vs array_flip
    If I had an array of signed integers e.g: Array ( [0] => -3 [1] => 1 [2] => 2 [3] => 3 [4] => 3 ) To get unique values I would instinctively use array_unique but after consideration I could perform array_flip twice which would have the same effect, and I think it would be quicker? array_unique O(n log n) because of the sort operation it uses array_flip O(n) Am I correct in my assumptions? UPDATE / EXAMPLE: $intArray1 = array(-4,1,2,3); print_r($intArray1); $intArray1 = array_flip($intArray1); print_r($intArray1); $intArray1 = array_flip($intArray1); print_r($intArray1); Array ( [0] => -3 [1] =
  • array_unique and then renumbering keys [duplicate]
    This question already has answers here: Closed 8 years ago. Possible Duplicate: Re-index numeric array keys I have an array as follows Array ( [0] => 15/11/2012 - 18/11/2012 [1] => 15/11/2012 - 18/11/2012 [2] => 15/11/2012 - 18/11/2012 [3] => 15/11/2012 - 18/11/2012 [4] => 19/12/2012 - 24/12/2012 [5] => 24/12/2012 - 01/01/2013 [6] => 24/12/2012 - 01/01/2013 [7] => 16/01/2013 - 01/02/2013 ) I am using array_unique to remove the duplicates which is giving me Array ( [0] => 15/11/2012 - 18/11/2012 [4] => 19/12/2012 - 24/12/2012 [5] => 24/12/2012 - 01/01/2013 [7] => 16/01/2013 - 01/02/2013 ) How
  • PHP的多维数组删除重复(php multi-dimensional array remove duplicate)
    问题 不知道这个问题是否需要删除,但是我无法在其他地方找到答案,所以我可以去询问。 我有一个二维数组,如下所示: Array ( [0] => Array ( [0] => dave [1] => jones [2] => c@b.c ) [1] => Array ( [0] => john [1] => jones [2] => a@b.c ) [2] => Array ( [0] => bruce [1] => finkle [2] => c@b.c ) ) 我想删除那些重复的电子邮件。 因此,在上面的示例中,我只想删除[] [0]或[] [2]。 我不担心要检查名称或类似的东西,我只需要基于单个值对子数组进行重复数据删除。 此刻我有这样的事情 if(is_array($array) && count($array)>0){ foreach ($array as $subarray) { $duplicateEmail[$subarray[2]] = isset($duplicateEmail[$subarray[2]]); unset($duplicateEmail[$subarray[2]]); } } 但这是不对的。 任何帮助表示赞赏。 回答1 一种使用数组索引唯一性的快速解决方案: $newArr = array(); foreach ($array as $val)
  • PHP-将两个数组合并为一个数组(也删除重复项)(PHP - Merging two arrays into one array (also Remove Duplicates))
    问题 嗨,我正在尝试合并两个数组,并且还想从最终数组中删除重复的值。 这是我的数组1: Array ( [0] => stdClass Object ( [ID] => 749 [post_author] => 1 [post_date] => 2012-11-20 06:26:07 [post_date_gmt] => 2012-11-20 06:26:07 ) 这是我的数组2: Array ( [0] => stdClass Object ( [ID] => 749 [post_author] => 1 [post_date] => 2012-11-20 06:26:07 [post_date_gmt] => 2012-11-20 06:26:07 ) 我正在使用array_merge将两个数组合并为一个数组。 它正在给出这样的输出 Array ( [0] => stdClass Object ( [ID] => 749 [post_author] => 1 [post_date] => 2012-11-20 06:26:07 [post_date_gmt] => 2012-11-20 06:26:07 [1] => stdClass Object ( [ID] => 749 [post_author] => 1 [post_date] => 2012-11-20 06:26
  • PHP合并仅具有NOT DUPLICATED值的数组(PHP merge arrays with only NOT DUPLICATED values)
    问题 我需要将两个数组合并为1个数组,但是我需要在它们之间具有相同的主数据之前删除(我指的是重复的值),合并时只需要唯一的值即可。 我怎样才能做到这一点? 这是数组示例: 第一个数组 array(3) { [0]=> object(stdClass)#17 (1) { ["email"]=> string(7) "gffggfg" } [1]=> object(stdClass)#18 (1) { ["email"]=> string(6) "wefwef@test.it" } [2]=> object(stdClass)#19 (1) { ["email"]=> string(6) "wefewf" } } 第二个数组 array(3) { [0]=> object(stdClass)#17 (1) { ["email"]=> string(7) "gffggfg@test.it" } [1]=> object(stdClass)#18 (1) { ["email"]=> string(6) "wefwef" } [2]=> object(stdClass)#19 (1) { ["email"]=> string(6) "wefewf" } } 回答1 您可以将array_merge()函数与array_unique()函数结合使用(两个标题都是不言自明的) $array =
  • C#中字符串键类型不区分大小写的字典(Case-INsensitive Dictionary with string key-type in C#)
    问题 如果我有Dictionary<String,...>是否可以使ContainsKey方法不区分大小写? 这似乎相关,但我不太了解:c#字典:通过声明使Key不区分大小写 回答1 这似乎相关,但我不太了解:c#字典:通过声明使Key不区分大小写 确实是有关的。 解决方案是告诉字典实例不要使用标准的字符串比较方法(区分大小写),而要使用不区分大小写的方法。 这是使用适当的构造函数完成的: var dict = new Dictionary<string, YourClass>( StringComparer.InvariantCultureIgnoreCase); 构造函数需要一个IEqualityComparer,它可以告诉字典如何比较键。 StringComparer.InvariantCultureIgnoreCase提供了一个IEqualityComparer实例,该实例以不区分大小写的方式比较字符串。 回答2 var myDic = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase); myDic.Add("HeLlo", "hi"); if (myDic.ContainsKey("hello")) Console.WriteLine(myDic["hello"]); 回答3
  • 如何使用jsr310 DateTimeFormatter解析不区分大小写的字符串?(How to parse case-insensitive strings with jsr310 DateTimeFormatter?)
    问题 jsr-310有一个方便的类DateTimeFormatters ,它允许您构造DateTimeFormatter 。 我特别喜欢pattern(String)方法-请参阅javadoc 但是,我遇到了一个区分大小写的问题-例如 DateTimeFormatters.pattern("dd-MMM-yyyy"); 与“ 2012年1月1日”匹配,但与“ 2012年1月1日”或“ 2012年1月1日”匹配。 一种方法是分解字符串并解析组件,另一种方法是使用Regex将不区分大小写的字符串替换为区分大小写的字符串。 但这似乎应该是一种更简单的方法... 回答1 根据用户指南(离线,请参阅JavaDoc),您应该使用DateTimeFormatterBuilder来构建复杂的DateTimeFormatter 例如 DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder(); builder.parseCaseInsensitive(); builder.appendPattern("dd-MMM-yyyy"); DateTimeFormatter dateFormat = builder.toFormatter(); 回答2 此替代方法对于初始化静态变量很有用: DateTimeFormatter
  • PHP不区分大小写的in_array函数(PHP case-insensitive in_array function)
    问题 使用in_array函数时是否可以进行不区分大小写的比较? 因此,使用这样的源数组: $a= array( 'one', 'two', 'three', 'four' ); 以下查找将全部返回true: in_array('one', $a); in_array('two', $a); in_array('ONE', $a); in_array('fOUr', $a); 哪些功能或一组功能会做同样的事情? 我不认为in_array本身可以做到这一点。 回答1 您可以使用preg_grep(): $a= array( 'one', 'two', 'three', 'four' ); print_r( preg_grep( "/ONe/i" , $a ) ); 回答2 显而易见的事情是将搜索词转换为小写: if (in_array(strtolower($word), $array)) { ... 当然,如果数组中有大写字母,则需要先执行以下操作: $search_array = array_map('strtolower', $array); 并搜索。 每次搜索都对整个数组执行strtolower毫无意义。 但是搜索数组是线性的。 如果你有一个大的数组或你打算这样做了很多,这将是更好地把搜索条件在阵列的关键,因为这将是更快的访问: $search_array = array
  • 合并两个数组(Combine two arrays)
    问题 我有两个这样的数组: array( '11' => '11', '22' => '22', '33' => '33', '44' => '44' ); array( '44' => '44', '55' => '55', '66' => '66', '77' => '77' ); 我想结合这两个数组,使其不包含重复项,并保留其原始键。 例如,输出应为: array( '11' => '11', '22' => '22', '33' => '33', '44' => '44', '55' => '55', '66' => '66', '77' => '77' ); 我已经尝试过了,但是它正在更改其原始键: $output = array_unique( array_merge( $array1 , $array2 ) ); 有什么办法吗? 回答1 只需使用: $output = array_merge($array1, $array2); 那应该解决。 因为如果一个键出现多次(例如您的示例中为'44' ,则使用字符串键,因此一个键将覆盖具有相同名称的处理键。 因为在您的情况下,它们两者都具有相同的值,但这无关紧要,并且还会删除重复项。 更新:我刚刚意识到,PHP将数字字符串键视为数字(整数),因此其行为将是这样,这意味着它也对键进行了重新编号... 一种解决方法是重新创建密钥。
  • xpath中不区分大小写的匹配?(case-insensitive matching in xpath?)
    问题 例如,对于下面的xml <CATALOG> <CD title="Empire Burlesque"/> <CD title="empire burlesque"/> <CD title="EMPIRE BURLESQUE"/> <CD title="EmPiRe BuRLeSQuE"/> <CD title="Others"/> <CATALOG> 如何用xpath匹配前4条记录,例如//CD[@title='empire burlesque'] 。 有xpath函数可以做到这一点吗? 还接受其他解决方案,例如PHP函数。 回答1 XPath 2具有小写(和大写)字符串功能。 这与不区分大小写的代码不太一样,但是希望它足够接近: //CD[lower-case(@title)='empire burlesque'] 如果您使用的是XPath 1,则有一个使用翻译的技巧。 回答2 matchs()是XPATH 2.0函数,允许不区分大小写的正则表达式匹配。 标志之一是i ,表示不区分大小写的匹配。 以下XPATH使用match()函数以及不区分大小写的标志: //CD[matches(@title,'empire burlesque','i')] 回答3 这在Chrome Developer工具中无法找到元素,我正在寻找屏幕上的“提交”按钮 //input[matches(
  • 如何使用LIKE通配符在列中搜索(不区分大小写)?(How can I search (case-insensitive) in a column using LIKE wildcard?)
    问题 我环顾四周,却找不到我想要的东西,所以去了。 SELECT * FROM trees WHERE trees.`title` LIKE '%elm%' 这很好用,但是如果树被命名为Elm或ELM等则不行。 如何使此通配符搜索的SQL大小写不敏感? 我正在使用MySQL 5和Apache。 回答1 SELECT * FROM trees WHERE trees.`title` COLLATE UTF8_GENERAL_CI LIKE '%elm%' 实际上,如果将COLLATE UTF8_GENERAL_CI添加到列的定义中,则可以忽略所有这些技巧:它将自动运行。 ALTER TABLE trees MODIFY COLUMN title VARCHAR(…) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI. 这还将重建该列上的所有索引,以便可以将其用于查询而无需以“%”开头 回答2 我总是用lower解决这个问题: SELECT * FROM trees WHERE LOWER( trees.title ) LIKE '%elm%' 回答3 区分大小写在列/表/数据库排序规则设置中定义。 您可以通过以下方式在特定归类下进行查询: SELECT * FROM trees WHERE trees.`title` LIKE '%elm%'
  • 如何在JTable上执行不区分大小写的过滤器?(How can I perform a case-insensitive filter on a JTable?)
    问题 我正在制作一个表格,表格下方有一个文本字段,您可以在其中输入单词以过滤表格。 它可以工作,但是我想做的是能够使用键入的单词过滤它,而忽略单词的大小写。 有没有一种方法可以在不创建自定义RowFilter情况下完成此操作? 您可以运行此SCCEE来查看我在说什么。 我希望能够在输入usa ,它会过滤USA 。 import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JApplet; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.RowFilter; import javax.swing.table.TableModel; import javax.swing.table.TableRowSorter; public class
  • 更改MYSQL数据库不区分大小写表名
    今天郁闷死了,在LINUX下调一个程序老说找不到表,但是我明明是建了表的,在MYSQL的命令行下也可以查到,为什么程序就找不到表呢?  后来请教了一个老师才搞定,原来是LINUX下的MYSQL默认是要区分表名大小写的,哎,弄了那么旧,害死我了。  让MYSQL不区分表名大小写的方法其实很简单:  1.用ROOT登录,修改/etc/my.cnf  2.在[mysqld]下加入一行:lower_case_table_names=1  3.重新启动数据库即可。1、Linux下mysql安装完后是默认:区分表名的大小写,不区分列名的大小写;2、用root帐号登录后,在/etc/my.cnf中的[mysqld]后添加添加lower_case_table_names=1,重启MYSQL服务,这时已设置成功:不区分表名的大小写;lower_case_table_names参数详解:lower_case_table_names=0其中0:区分大小写,1:不区分大小写MySQL在Linux下数据库名、表名、列名、别名大小写规则是这样的:1、数据库名与表名是严格区分大小写的;2、表的别名是严格区分大小写的;3、列名与列的别名在所有的情况下均是忽略大小写的;4、变量名也是严格区分大小写的;MySQL在Windows下都不区分大小写。mysql默认是对字母的大小写不区分的mysql> create