0

I have to send out SMS in multiples of 150 batch per CURL post. Here is my code,

$mobiles = "9844700001,9844700002,9844700003,9844700004;9844700005
 9844700006,9844700007,9844700008,9844700009,9844700010,.... upto 1000 numbers"
$rmobiles = preg_split('/[\ \n\r\;\:\,]+/', $mobiles, -1, PREG_SPLIT_NO_EMPTY);
if(count($rmobiles) <= 1000){
    foreach($rmobiles as $key => $value){
        if ($key % 150 == 0) {
            //Generate a new random ID
            $randno = rand(0,10000);
        }
        $this->addtoDB("00000", $value, $randno);
    } 
    return $this->sendmsms($randno);
} else {
    echo "error, max 1000";
}

Since sendmsms function is outside the foreach loop, it only sends out the last batch with the random number and if I include sendmsms function within foreach loop then the function will run as many mobile numbers are there.

How should I able to run sendmsms function based on generated randno and so that my curl function sendmsms will run properly and generate db records genuinely.

Edit

I again tried like this, but its inserting single record in my DB.

    foreach($rmobiles as $key => $value){
        if ($key % 150 == 0) {
            //Generate a new random ID
            $randno = rand(0,10000);
        }
        $this->addtoDB("00000", $value, $randno);
        if ($key % 150 == 0) {
            return $this->sendmsms($randno);
        }
    } 

Edit 2

I even tried creating array for randno. But only first batch is going, not the all 7 batches.

    $arr = array();
    foreach($rmobiles as $key => $value){
        if ($key % 150 == 0) {
            //Generate a new random ID
            $randno = rand(0,10000);
            $arr[] = $randno;
        }
        $this->addtoDB("00000", $value, $randno);
    }
    foreach($arr as $k => $v){
        return $this->sendmsms($v);
    }

When I echo it, it perfectly displays but through DB its going just 1 batch. What could be the reason?

5
  • Move sendmsms into if ($key)? Commented Apr 11, 2017 at 20:28
  • This is not linked to batch-file; please read the tag info! Commented Apr 11, 2017 at 20:32
  • Good point, I once thought but wanted to get experts answer here, will try and update, thanks Commented Apr 11, 2017 at 20:32
  • @aschipfl sorry, I must have clicked on all the recommended tags by SO. Commented Apr 11, 2017 at 20:33
  • u_mulder, since I need to return the sendmsms function, once it returns then addtoDB function wont run. I have to run the function afer addtoDB function. I will try again after addtoDB with if($key) %150 by repeating. Will that do? Commented Apr 11, 2017 at 20:43

1 Answer 1

1

One solution that comes to mind is using array_chunk() to break $rmobiles into multiple arrays with a maximum of 150 elements each. Not sure if your sendmsms function takes a string or an array, but something like this may get you on the right track:

$mobiles = "9844700001,9844700002,9844700003,9844700004;...";
$rmobiles = preg_split('/[\ \n\r\;\:\,]+/', $mobiles, -1, PREG_SPLIT_NO_EMPTY);
foreach (array_chunk($rmobiles, 150) as $batch) {
    $this->sendmsms(implode(',',$batch));
}
Sign up to request clarification or add additional context in comments.

3 Comments

No, since it has to go through all db insertion, adding/debiting balance, updating provider response, the given solution wont be much of a help.
Edited my question, what should be the problem for my edited try?
Okay, finally got it solved. In my 2nd try, I was using return hence it was delivering either the first batch or last batch. I later realised after looking at your code that I have been using return. So thanks to you. And since your answer hinted me at the right path, I am accepting your answer. If you could also update with the outcome, others should benefit. Thanks again.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.