【问题标题】:php - create assciative array while loopphp - 在循环中创建关联数组
【发布时间】:2012-03-18 11:09:32
【问题描述】:

我正在尝试使用以下“foreach”循环从一个现有数组 ($array) 中创建 2 个新数组。但是我不确定它是否正确:

        $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) 创建两个单独的数组:所有具有数字的用户(这是我们拥有的函数),以及所有其余的 - 他们的电子邮件。 所以结果将是 2 个新数组,如下所示: 对于特定的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')}

【问题讨论】:

  • 你想在制作数组时发生什么?
  • 您能否发布原始数组的var_dump,以及您希望新数组的外观如何?
  • 您绝对不应该使用数组结构,它要求您使用“entry1”、“entry2”等键。数组可以是列表(以数字作为键,例如 0、1 , 2, 3...) 或关联,其中键是元素的名称(例如 'name'、'url'、'email' 或其他)。
  • 这将是一个无限循环。

标签: php loops foreach while-loop associative-array


【解决方案1】:

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

$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() 函数效果很好。

【讨论】:

    【解决方案2】:

    先说几件事:

    • 初始化变量是一种很好的做法,只需这样做(它有很多好处)。
    • 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));
        }
    }
    

    【讨论】:

    • 好吧,我们有一个非常相似的答案^^
    • 关于“foreach”的好电话,这就是我首先想到的,不知道为什么我改变了它。其次,并不总是设置“数字”。这正是我正在检查的内容 - 如果设置了数字,我想获取此条目并将其包含在一个数组中。如果不是 - 我想获取这个条目并将其包含在另一个数组中。
    • @LucyWeatherford $number = function_call(); 即使它没有返回任何东西 var_dump($number) 也会显示 null 而不是 unset 或类似的东西。无论如何,提供的代码有什么问题?
    • 如何知道$entry是否为$array['entry']?
    • 你是故意跳过那一行的吗?没有必要吗?谢谢!
    【解决方案3】:

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

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

    在您的代码中,while($array) 不会在数组上循环,它会循环直到 $array == false 因为 $array 在你的循环中没有改变,它要么永远不会进入循环,要么永远不会退出 通常,使用 foreach 循环生成的代码更容易理解

    【讨论】:

    • 你的意思是$item['entry1'];?另外,$array 是从 mysql 查询中提取的,有什么想法我应该添加/更改以使其从资源 ID 变为此处的数组吗?谢谢。
    • “从 mysql 查询中提取”是什么意思,你能显示 $array 被赋值的那一行吗?或 var_dump($array); 的输出
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 2016-09-09
    • 2012-06-26
    相关资源
    最近更新 更多