php - 在循环时创建关联数组

I am trying to create 2 new arrays out of one existing array ($array), using the following "foreach" loop. However I am not sure it is correct:

        $emails = array();
        $numbers = array();
        while($array){
            $entry = $array['entry1'];
            $number = number($entry);
            if(isset($number) && (strlen($number) > 9)){
                $numbers[] = array('entry1' => $entry, 'number' => $number);
            }
            else{
                $email = email($entry);
                $emails[] = array('entry1' => $entry, 'email' => $email);
            }
        }

should the internal arrays have []? do I even need to start the arrays outside of the while loop? or skip it? is it better to use a foreach loop?

Update:

Okay, here is the original array: It is extracted from a mysql query, of sets of two numbers:

{('uid1','uid2'),('uid1','uid5'),('uid9','uid93'),....) There might be other data in each row, but these are the only two data points that really matter.

What I am trying to do is for a specific user ($entry), create two separate arrays: of all the users that have numbers (that's a function we have), and all the rest - of their emails. So the outcome will be 2 new arrays which will look like this: for a specific uid79887:

numbers array: {('uid8','xxx-xxxx-xxx'),('uid34','yyy-yyyy-yyy'),('uid654','vvv-vvvv-vvv')}

emails array: {('uid4','mmm@mmm.com'),('uid1','lll@lll.com'),('uid55554','ppp@ppp.com')}

Assuming this isn't some kind of homework assignment, why don't you do it this way:

$emails = array();
$numbers = array();

foreach( $array as $entry )
{
    $number = number($entry);
    if( $number && strlen($number) > 9 )
    {
        array_push($numbers, array('entry1' => $entry, 'number' => $number));
    }
    else
    {
        array_push($emails, array('entry1' => $entry, 'email' => email($entry)));
    }
}

It is better to use built in functions that trying to roll your own. The foreach() function works very well.

Few things first:

  • It's good practice to initialize your variables, just do it (it has many positives).
  • What kind of test is while($array)? You should use foreach( $array as $entry) or while( count( $array)) if you're removing items from array.
  • Why are you testing isset( $number) when it's always set? It's initialized variable. You're probably checking null, so use !is_null() or ($number !== null). Even if it works it's misleading.

I guess your code should look like this:

$emails = array();
$numbers = array();
foreach( $array as $entry){
    $entry = isset( $entry['entry1']) ? $entry['entry1'] : null;
    $number = number( $entry);
    if( strlen($number) > 9 ){ // If $number is empty it will have strlen < 1 .)
       $numbers[] = array('entry1' => $entry, 'number' => $number);
    } else {
       $emails[] = array('entry1' => $entry, 'email' => email( $entry));
    }
}

I guess this is what you are trying to acheive:

$emails = $numbers = Array();
foreach($array as $item) {
  $e = $item['entry1'];
  $number = number($e);
  if(strlen($number) > 9) {
    $numbers[] = Array('entry1' => $e, 'number' => $number);
  }
  else {
    $email = email($entry);
    $emails[] = Array('entry1' => $e, 'email' => $email);
  }
}

in your code, while($array) do not loop on the array, it loop until $array == false as $array do not change in your loop it will either never enter or the loop, or never exit generally, using a foreach loop produce code easier to understand