【问题标题】:PHP - Arrays and ForeachPHP - 数组和 Foreach
【发布时间】:2013-04-11 17:23:21
【问题描述】:

我在 Google 中搜索并查阅了 PHP 文档,但无法弄清楚以下代码是如何工作的:

$some='name=Licensing Module;nextduedate=2013-04-10;status=Active|name=Test Addon;nextduedate=2013-04-11;status=Active';
function getActiveAddons($somet) {
    $addons = array( );
    foreach ($somet as $addon) {

        if ($addon['status'] == 'Active') {
            $addons[] = $addon['name'];
            continue;
        }
    }

    return $addons;
}
echo (count( getActiveAddons( $some ) ) ? implode( '<br />', getActiveAddons( $some ) ) : 'None');

代码总是回显None

请帮帮我。

【问题讨论】:

  • 试试var_dump($addon) - 它看起来像你认为的那样吗?
  • 您期望什么?您的参数是字符串,而不是数组:foreach 将被跳过。
  • @str 实际上 foreach 可以与任何实现 Traversable 接口的对象一起使用。但你的观点仍然有效:)

标签: php arrays foreach


【解决方案1】:

我不知道你从哪里得到这段代码,但你初始化$some 的方式错误。它应该是这样的数组:

$some = array(
    array(
     'name' => 'Licensing Module',
     'nextduedate' => '2013-04-10',
     'status' => 'Active'
    ),
    array(
     'name' => 'Test Addon'
     'nextduedate' => '2013-04-11',
     'status' => 'Active'
    )
 );

我猜你读过的文章期望你将原始字符串解析成这种格式。

你可以这样实现:

$string = 'name=Licensing Module;nextduedate=2013-04-10;status=Active|name=Test Addon;nextduedate=2013-04-11;status=Active';

$result = array();
foreach(explode('|', $string) as $record) {
    $item = array();
    foreach(explode(';', $record) as $column) {
        $keyval = explode('=', $column);
        $item[$keyval[0]] = $keyval[1];
    }
    $result[]= $item;
}

// now call your function
getActiveAddons($result);

【讨论】:

  • 好的,谢谢。您可以更改代码以使其与定义的 $some 输入一起使用吗?非常感谢:D
  • 给我一分钟。会准备
【解决方案2】:

$some 不是数组,因此 foreach 不会对其进行操作。你需要做类似的事情

$some = array(
   array(
      'name' => 'Licensing Module',
      'nextduedate' => '2013-04-10',
      'status' => 'Active'
   ),
   array(
      'name' => 'Test Addon',
      'nextduedate' => '2013-04-11',
      'status'=> 'Active'
   )
);

这将创建一个可以循环的多维数组。

function getActiveAddons($somet) {
    $addons = array( );
    foreach ($somet as $addon) {
        foreach($addon as $key => $value) {
            if ($key == 'status' && $value == 'Active') {
                $addons[] = $addon['name'];
                continue;
            }
        }
    }
    return $addons;
}

【讨论】:

  • 好的,谢谢。您可以更改代码以使其与定义的 $some 输入一起使用吗?非常感谢:D
  • 非常感谢您的帮助:)
【解决方案3】:

首先,您的 $some 变量只是一个字符串。您可以使用explode() 将字符串解析为数组,但从数组开始会更容易:

$some = array(
    array(
        "name" => "Licensing Module",
        "nextduedate" => "2013-04-10",
        "status" => "Active",
    ),
    array(
        "name" => "Test Addon",
        "nextduedate" => "2013-04-11",
        "status" => "Active",
    )
);

现在,对于你的功能,你走在了正确的轨道上,但我会清理它:

function getActiveAddons($somet) {
    if (!is_array($somet)) {
        return false;
    }

    $addons = array();
    foreach ($somet as $addon) {
        if ($addon['status'] == 'Active') {
            $addons[] = $addon['name'];
        }
    }

    if (count($addons) > 0) {
        return $addons;
    }

    return false;
}

最后是你的输出(你调用了两次函数):

$result = getActiveAddons($some);

if ($result === false) {
    echo "No active addons!";
}
else {
    echo implode("<br />", $result);
}

【讨论】:

  • 非常感谢您的帮助:)
猜你喜欢
  • 2010-11-13
  • 2012-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多