使用php同步电话簿

使用php同步电话簿,php,mysql,regex,yii2,Php,Mysql,Regex,Yii2,我正在使用yii2框架开发web服务来同步联系人。我从移动端获取整个电话簿(json数组),我必须检查数据库中有哪些电话号码 请求参数应该是这样的 { "user_id": "4", "user_details": [{ "first_name": "A", "last_name": "A" }, { "first_name": "B", "last_name": "B" ,

我正在使用yii2框架开发web服务来同步联系人。我从移动端获取整个电话簿(json数组),我必须检查数据库中有哪些电话号码

请求参数应该是这样的

{
    "user_id": "4",
    "user_details": [{
        "first_name": "A",
        "last_name": "A"

    }, {
        "first_name": "B",
        "last_name": "B"
        ,
        "mobile_number": ["(888) 888-888", "(777) 777-777"]
    }, {
        "first_name": "C",
        "last_name": "C",
        "mobile_number": ["+918000584123", "(666) 666-6666", "(555) 555-5555", "(444) 444-4444"]
    }]
}
为了实现这个功能,我完成了以下代码

public function actionSyncPhoneBook()
{
    $amResponse = $amResponseData = [];
    $snUserId   = $this->amData['user_id'];// Here i will get user_id
    if (!empty($this->omUser))
    {
        $userDetails                       = $this->amData['user_details'];//Here i will get array of user_details
        $amAppContacts =[];
        $amNonAppContacts = [];
        //I have loop here of user details to scan mobile number array
        foreach ($userDetails as $userKeys) 
        {
            //In case if mobile number array is not given  
            if(!empty($userKeys["mobile_number"]))
            {
                // Loop for scanning mobile numbers
                foreach ($userKeys["mobile_number"] as $key => $mobileNumber) 
                {
                    //regex for matching mobile number.
                    $phone = preg_replace('/[^a-zA-Z0-9+]/', '', $mobileNumber);
                    $oModelUser = Users::find()
                        ->where(['phone' => $phone])
                        ->one();
                        //Check if conttact is exists or not using exist method
                        $checkContactExists                        = Users::find()->where(['phone' => $phone])->exists();
                        if($checkContactExists                     == 1)
                        {
                            $oModelFriends                             = Friends::find()->where(["from_user_id"=>$snUserId,"to_user_id"=>$oModelUser->id])->asArray()->one();   
                            $amCheckPhoneNumber['user_id']             = !empty((string)$oModelUser->id) ? (string)$oModelUser->id  : '';
                            $amCheckPhoneNumber['first_name']          = !empty($oModelUser->first_name) ? $oModelUser->first_name  : '';
                            $amCheckPhoneNumber['last_name']           = !empty($oModelUser->last_name) ? $oModelUser->last_name  : '';
                            $amCheckPhoneNumber['email']               = !empty($oModelUser->email) ? $oModelUser->email  : '';
                            $amCheckPhoneNumber['phone']               = !empty($oModelUser->phone) ? $oModelUser->phone  : '';
                            $amCheckPhoneNumber['status']              = !empty((string)$oModelUser->status) ? (string)$oModelUser->status  : '';
                            $amCheckPhoneNumber['relationship_status'] = !empty($oModelUser->relationship_status) ? $oModelUser->relationship_status  : '';
                            $amCheckPhoneNumber['mobile_verified']     = !empty((string)$oModelUser->mobile_verified) ? (string)$oModelUser->mobile_verified  : '';
                            $amCheckPhoneNumber['email_verified']      = !empty($oModelUser->email_verified) ? $oModelUser->email_verified  : '';
                            $amCheckPhoneNumber['latitude']            = !empty($oModelUser->latitude) ? $oModelUser->latitude  : "0";
                            $amCheckPhoneNumber['longitude']           = !empty($oModelUser->longitude) ? $oModelUser->longitude  : "0";
                                if($oModelFriends["is_friend"] == 1)
                                {
                                        $amCheckPhoneNumber['is_friend']           = "friends";
                                }
                                    else
                                {
                                        $amCheckPhoneNumber['is_friend']           = "no_friends";
                                }

                            //User Image 
                            if(!empty($oModelUser->user_image))
                            {
                                if (filter_var($oModelUser->user_image, FILTER_VALIDATE_URL)) 
                                { 
                                    if(!empty($oModelUser->user_image))
                                    {
                                        $ssEventDetailsUserImage = $oModelUser->user_image;
                                    }
                                    else
                                    {
                                        $ssEventDetailsUserImage = Yii::$app->params['aws_cover_image_path'];
                                    }
                                }
                                else
                                {
                                    $ssEventDetailsUserImage =Yii::$app->params['aws_cover_image_path'];
                                }
                            }
                            else
                            {
                                $ssEventDetailsUserImage = Yii::$app->params['aws_cover_image_path'];
                            }   
                            //Cover  Image 
                            if(!empty($oModelUser->cover_image))
                            {
                                if (filter_var($oModelUser->cover_image, FILTER_VALIDATE_URL)) 
                                { 

                                    if(!empty($oModelUser->cover_image))
                                    {

                                        $ssCoverImage = $oModelUser->cover_image;
                                    }
                                    else
                                    {
                                        $ssCoverImage = Yii::$app->params['aws_cover_image_path'];
                                    }
                                }
                                else
                                {
                                    $ssCoverImage =Yii::$app->params['aws_cover_image_path'];
                                }
                            }
                            else
                            {
                                $ssCoverImage = Yii::$app->params['aws_cover_image_path'];
                            }                       
                            $amCheckPhoneNumber['cover_image']     = !empty($ssCoverImage) ? $ssCoverImage  : '';
                            $amCheckPhoneNumber['user_image']      = !empty($ssEventDetailsUserImage) ? $ssEventDetailsUserImage  : '';
                            $amCheckPhoneNumber['app_user'] = "1";
                            //Final Response of users those who are using application
                            $amAppContacts[]         = $amCheckPhoneNumber;
                    }
                    else
                    {
                          //Users who does not use application.
                          $otherUsers['user_id']             = !empty($userKeys['id']) ? $userKeys['id']  : '';
                          $otherUsers['first_name']          = !empty($userKeys['first_name']) ? $userKeys['first_name']  : '';
                          $otherUsers['last_name']           = !empty($userKeys['last_name']) ? $userKeys['last_name']  : '';
                          $otherUsers['email']               = !empty($userKeys['email']) ? $userKeys['email']  : '';
                          $otherUsers['phone']               = !empty($mobileNumber) ? $mobileNumber : '';
                          $otherUsers['status']              = !empty($userKeys['status']) ? $userKeys['status']  : '';
                          $otherUsers['relationship_status'] = !empty($userKeys['relationship_status']) ? $userKeys['relationship_status']  : '';
                          $otherUsers['user_image']          = Yii::$app->params['aws_cover_image_path'];
                          $otherUsers['cover_image']         = Yii::$app->params['aws_cover_image_path'];
                          $otherUsers['mobile_verified']     = !empty($userKeys['mobile_verified']) ? $userKeys['mobile_verified']  : '';
                          $otherUsers['email_verified']      = !empty($userKeys['email_verified']) ? $userKeys['email_verified']  : '';
                          $otherUsers['latitude']            = !empty($userKeys["latitude"]) ? $userKeys["latitude"]  : "0";
                          $otherUsers['longitude']           = !empty($userKeys["longitude"]) ? $userKeys["longitude"]  : "0";
                          $otherUsers['is_friend']           = "";
                          $otherUsers['app_user']     = "0";
                          //Final Response of users those who are not using  app.
                          $amNonAppContacts[] = $otherUsers;
                    }
                }
            }
        }
        //Merging the app users and non-app users together.
        $amResponseData = array_merge($amAppContacts,$amNonAppContacts);
        $amResponse     = Common:: successResponse("Sync your phonebook.",$amResponseData);                
        Common::encodeResponseJSON($amResponse);
    }
}
从上面的代码中,我正在检查数据库中是否存在手机号码,它将推送到应用程序用户中,其余的将推送到非应用程序用户中

在我的数据库中,手机号码以+(countryCode)(mobileNumber)的格式存储

示例+918000584123

但如果我没有通过+91或任何国家/地区代码,它也应该有效

如果手机号码数组是这样的话,它应该可以工作

"mobile_number": ["(888) 888-888", "(777) 777-777"] 
"mobile_number": ["+918000584123","+91 8000584123","8000584123", "(666) 666-6666", "(555) 555-5555", "(444) 444-4444"]
或者应该是这样

"mobile_number": ["(888) 888-888", "(777) 777-777"] 
"mobile_number": ["+918000584123","+91 8000584123","8000584123", "(666) 666-6666", "(555) 555-5555", "(444) 444-4444"]
如何实现这一功能

任何帮助都将不胜感激


提前谢谢

不需要这样的正则表达式

$phone = preg_replace('/[^a-zA-Z0-9+]/', '', $mobileNumber);
相反,你可以使用

$phone = preg_replace('/[^0-9]/', '', $mobileNumber);
然后像下面这样改变你的where条件。你应该使用LIKE条件

$oModelUser = Users::find()->where("phone LIKE'%".$phone."'")->one();    

$checkContactExists = Users::find()->where("phone LIKE '%".$phone."'")->exists();

你给它加了
mysql
,所以我从这个角度回答

不同的电话号码应该放在一个单独的表格中,并附上他们所属的人的id。这样,任何人都可以有任意数量的数字。我建议1:many,而不是many:many,简单地让偶尔共享的电话成为新表中的dup号码


该表将有一个关于数字的非唯一索引,因此在SQL中查找具有给定数字(或一组数字,使用中的
)的人是“微不足道的”。

由于您有多个国家,那么您需要传递一些信息来验证它是来自DOM还是来自数据库字段。这将检查国家,然后检查电话号码。。对于国家代码。是的,我们有全球应用程序。我们在注册过程中获取国家代码和手机号码,并将+(国家代码)(mobileNumber)存储到用户表中。只需在输入框中,不允许用户输入国家代码,并且只允许他们输入手机号码,再添加一个下拉列表,获取所有国家代码,并允许他们选择国家(在下拉列表中,输入国家代码而不是国家名称)。。当您进行查询时,将两者合并并搜索。是的,我们不允许用户手动输入国家代码用户必须从下拉列表中选择国家并在文本框中写入手机号码,从移动端他们将国家代码和手机号码合并,从后端我们存储相同的国家代码。确定。。那么,问题是什么呢?