循环时创建关联数组


create assciative array while loop

我正试图使用下面的"foreach"循环,从一个现有数组($array)中创建两个新数组。然而,我不确定它是正确的:

        $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);
            }
        }

内部数组是否应该具有[]?我甚至需要在while循环之外启动数组吗?还是跳过它?使用foreach循环更好吗?

更新:

好吧,这是原始数组:它是从mysql查询中提取的,由两个数字组成:

{('uid1','uid2'),('uid1','uid5'),('uid9','uid93'),....)每行中可能还有其他数据,但这是仅有的两个真正重要的数据点。

我试图为一个特定的用户($entry)创建两个单独的数组:所有有数字的用户(这是我们的一个函数),以及他们的所有其他电子邮件。因此,结果将是两个新的数组,看起来如下:对于特定的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')}

首先有几件事:

  • 初始化变量是一种很好的做法,只需执行即可(这有很多好处)
  • while($array)是什么样的测试?若要从数组中删除项目,则应使用foreach( $array as $entry)while( count( $array))
  • 为什么在isset( $number)总是设置的情况下测试它?它是初始化的变量。您可能正在检查null,所以请使用!is_null()($number !== null)。即使它有效,也会产生误导

我猜你的代码应该是这样的:

$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));
    }
}

我想这就是你想要实现的:

$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);
  }
}

在代码中,($array)不在数组上循环,而是循环到$array==false由于$array在循环中不会更改,它将永远不会进入或退出循环通常,使用foreach循环生成更易于理解的代码

假设这不是某种家庭作业,为什么不这样做呢:

$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)));
    }
}

最好使用那些试图滚动自己的内置函数。foreach()功能运行良好。