1. 程式人生 > >元素與集合的問題思考

元素與集合的問題思考

key repl 編輯 emp 今天 als earch 單個 模式

今天同事遇到一個元素和集合的問題,引發了我的思考。情景如下

一個元素和集合,如果元素在集合內,則移除該集合內的這個元素,否則添加該元素進入這個集合。

他給出代碼如下:

<?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));
?>

或許你有更好的思路,歡迎留言

元素與集合的問題思考