元素与集合的问题思考

今天同事遇到一个元素和集合的问题,引发了我的思考。情景如下

一个元素和集合,如果元素在集合内,则移除该集合内的这个元素,否则添加该元素进入这个集合。

他给出代码如下:

<?php
$value=5;
$list=array(1,2,3,4,5,6,7,8,9,10);
if(empty($list) || !in_array($value,$list) )
{
    $list[] = $value;
}else
{
    foreach($list as $k => $v)
    {
        if($v == $value)
        {
            unset($list[$k]);
        }
    }
}
?>

这个模式比较基础化,也很容易理解,不过针对这个foreach,我们都有一点顾及,于是修改了一下

<?php
$value=5;
$list=array(1,2,3,4,5,6,7,8,9,10);
if(empty($list) || !in_array($value,$list) )
{
    $list[] = $value;
}else
{
    $search_key=array_search($value,$list);
    unset($list[$search_key]);
}
?>

这个改进去掉了foreach的循环,实际上,是使用 array_search代替了foreach。

小小的问题突然引发了我的思考,这个array_search  in_array  empty好像有点重复了,于是我想到另一种写法

<?php
$value=5;
$list=array(1,2,3,4,5,6,7,8,9,10);
$search_key=array_search($value,$list);
if($search_key!==false)
{
    unset($list[$search_key]);
}else
{
    $list[] = $value;
}
?>

之前在做编辑更新绑定关系的时候,我记得我也处理过类似问题,是一种集合差集的概念,于是我想到这样写

<?php
$value=5;
$list=array(1,2,3,4,5,6,7,8,9,10);
if(in_array($value,$list))
{
    $value=(array)$value;//单个元素转数组
    $list=array_diff($list,$value);//数组求差集
}else
{
    $list[]=$value;//放入数组
}
?>

如果换一种思路,采用字符串处理,又该如何解决呢?

字符串的查找 替换 拼接给了我一定的灵感,代码如下

<?php
$value=5;
$list=array(1,2,3,4,5,6,7,8,9,10);
$delimiter=",";
$value=$delimiter.$value.$delimiter;
$list =$delimiter.implode($delimiter,$list).$delimiter;
if(strpos($list,$value)!==false)
{
    //找到了 删除
    $list=str_replace($value,$delimiter,$list);
}else{
    //没找到 添加
    $list=trim($list,$delimiter).$value;
}
$list=array_filter(explode($delimiter,$list));
?>

或许你有更好的思路,欢迎留言

时间: 2024-11-07 02:18:36

元素与集合的问题思考的相关文章

LoadRunner几个重要的概念:事务、集合点、思考时间

在LoadRunner的脚步编写中,有三个重要的概念:事务.集合点.思考时间 事务: 事务又称为Transaction,在LoadRunner中的定义如下:An end-to-end(browser-to-browser)  measurement of one or more user actions within action  file.中文理解如下:事务(Transaction)是这样一个点,我们为了衡量某个action的性能,需要在action的开始和结束位置插入这样一个范围,这就定义

not(expr|ele|fn)从匹配元素的集合中删除与指定表达式匹配的元素

not(expr|ele|fn) 概述 从匹配元素的集合中删除与指定表达式匹配的元素 参数 exprStringV1.0 一个选择器字符串.深圳dd马达 elementDOMElementV1.0 一个DOM元素 function(index)FunctionV1.4 一个用来检查集合中每个元素的函数.this是当前的元素. 示例 描述: 从p元素中删除带有 select 的ID的元素 HTML 代码: <p>Hello</p><p id="selected&quo

从集合的角度思考DP问题

从集合的角度思考DP问题 如上图展示了DP问题思考的一个简单步骤来自y总直播,"就像计算乘法一样,学会分析DP问题就像学会列竖式一样,让处理DP问题更简单"这就话让我瞬间意识到分析问题的重要性,处理DP问题不应该是想出转移过程,应该是一步步分析出来的.这篇博客记录以后做题过程中我对DP分析方法的理解和总结 #one. 杨老师的照相排列 (第一篇废话较多) DP问题 这道题目前我解释不出为什么要用DP做,但Count是DP一类题型 分析过程 DP一般就是一个状态向另一个状态转移,在这个过

如何将某个元素放到集合第一个

一.情节交待 现在有一个用户的信息列表,列表中所包含的信息有普通信息.置顶信息.还有标注成"特别关注"的信息,"特别关注"的信息不仅在信息表中存在,还在推荐信息表中存在(说明:"特别关注"不是拿字段做标识,而是关联表记录来区分,因为涉及到有效时间之类的.).我现在需要把"特别关注"的信息放在信息列表的最前面,但是列表中的信息都是按信息的刷新时间降序排列的,默认是把所有信息都读取出来的,当然也包括"特别关注"

Python - 集合与元素之集合定义和基本操作方法

集合(set) 定义:由不同元素组成的集合,集合中是一组无序排列可hash的值(不可变的值)例如数字.字符串.元组,可以作为字典的key 定义集合: # 定义集合 s = {1, 2, 3, 3, 3, 4, 5} print(s) print(type(s)) 输出: {1, 2, 3, 4, 5} <class 'set'> 定义可变集合set # 定义可变集合 s = set("hello") # ()内为可迭代类型 print(s) 输出: {'l', 'h', '

给定正整数n,计算出n个元素的集合{1,2,....,n}可以划分为多少个不同的非空集合

附源代码: #include<iostream> using namespace std; int F(int n,int m) { if(n<=2) return 1; if(m==1||n==m) return 1; else return F(n-1,m-1)+m*F(n-1,m); } void main() { int n; char end; int result = 0; cout<<"请输入正整数n="; cin>>n; for

给定正整数n,计算出n个元素的集合{1,2,....,n}能够划分为多少个不同的非空集合

附源码: #include<iostream> using namespace std; int F(int n,int m) { if(n<=2) return 1; if(m==1||n==m) return 1; else return F(n-1,m-1)+m*F(n-1,m); } void main() { int n; char end; int result = 0; cout<<"请输入正整数n="; cin>>n; for(

从N个元素的集合中随机取m个元素的算法实现

最近有一个需求,比较简单,就是如标题所说的,从N个元素中随机取m个元素,当然这m个元素是不能存在重复的.本以为这么简单的需求,应该有现成的工具类来实现,但是几次查找居然没找到(有知道的可以推荐下哈^_^).只好自己实现了下. 自己的实现思路也不知道是不是有问题,或者还有没有更好的思路来实现,所以在这里贴出来,供有兴趣的猿友提提建议.找找问题,或者找到更好的实现思路. 废话不多说,直接上代码(java实现) /** * 随机取num个从0到maxVal的整数.包括零,不包括maxValue * @

POJ 1703 Find them, Catch them(确定元素归属集合的并查集)

Find them, Catch them Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 52925   Accepted: 16209 Description The police office in Tadu City decides to say ends to the chaos, as launch actions to root up the TWO gangs in the city, Gang Drago