【问题标题】:php - Extract an associative arrayphp - 提取关联数组
【发布时间】:2016-02-03 22:47:58
【问题描述】:

我正在尝试提取混合关联数组,例如:

<pre>
        <?php


        bar();

        function bar(){
            $apple = 6;
            $ball = 2;
            $cat = 3;

            $data = ["apple" => 1, $ball,$cat];

            foo($data);
        }

        function foo($data){
            extract($data);
            echo "<br />apple:" . $apple;
            echo "<br />ball:" . $ball;
            echo "<br />cat:" .  $cat;
        }

        ?>
</pre>

$data 数组只能是数字的,只能是关联的或两者兼有。如果数组的元素缺少索引,它应该与变量相同。

【问题讨论】:

  • @Andrew,不。数组有时只能关联或数字。它们混合到任何水平。
  • $ball$cat 在范围内定义(提取之前),因此它们仍然存在。这就是为什么它们不能正常工作的原因。运行提取时,数组没有分配给变量的索引。 .
  • RTFM -> extract 使用键作为变量名创建变量,值作为... erm... 值。在您的第一个 sn-p 中,恰好$cat$ball 与数组中的键 01 具有相同的值,但 extract 实际上跳过了数字索引
  • 如果不是范围,则意味着您的数据不适合用于extract()。迭代您的数组并将数据手动收集到变量中,而不是使用extract() 来确保您获得值。
  • @tika 为什么一定要有数字键?你不能强制阵列如你所愿吗?如果名称不在键中,您如何知道 $data[0] 是 $ball 的值?如果您无法控制$data,您可能必须获取一个映射数组,说明预期的变量顺序是什么......为了说“第一个值是苹果,第二个是球,第三个是猫” ...然后使用此映射数组手动提取数据...

标签: php arrays extract


【解决方案1】:

这在您的函数中不起作用,因为 $ball 和 $cat 未在函数范围内定义。如果数组中的值有键,extract() 函数只会将值分配给变量,$apple 就是这样做的。这意味着 $apple 将在函数中输出,但 $ball 和 $cat 将是未定义的。

这是因为为了让 extract() 知道如何命名变量,数组中必须有一个键。

为此,您要么每次都需要手动指定数组中的键:

$apple = 6;
$ball = 2;
$cat = 3;
$data = ["apple" => $apple, "ball" => $ball, "cat" => $cat];

// Now, extracting from $data creates the variables we need...
// Unsetting the $apple, $ball, and $cat variables 
// allows us to see that extract is recreating them.
unset($apple, $ball, $cat);
extract($data);
echo $apple, $ball, $cat;

或者您需要检查 $ball 和 $cat 变量以查看它们是否为数组。如果它们是数组,您可以在数组中使用它们的键,以便 extract() 知道如何命名它创建的变量。是否需要动态判断变量是否已经有键(是数组),还是这样就够了?

编辑:这不应该用 extract() 来完成。实际上,您应该创建一个类并将这些数据存储在一个类中。然后,加载类将为您提供此信息。 extract() 是一个危险而混乱的野兽。

【讨论】:

  • 好点取消设置变量,了解发生了什么...!如果 $data 中没有 "ball" 和 "cat" 键,此代码将无法运行!
  • @Random:除非你给你的值加上前缀extract-ing
  • @MikelBitson,数据是混合数组,将是。
  • @tika 你明白为什么你永远不会从一个没有单词“ball”的数组中得到一个变量 $ball 吗?如果数据是混合的,我们需要查看数据的格式,以确定如何添加该键。要为提取工作添加密钥 HAS*。因此,如果密钥与 $ball 变量一起提供,我们需要查看如何格式化以正确地将其添加到 $data 数组中,从而为我们提供“ball”密钥。使用 is_array() 检查您的变量,并根据返回值手动添加键或使用变量中的键。
  • @MikelBitson,哦,是的。我现在明白了。真是impossible.
【解决方案2】:

另一个答案。重点还是一样的,如果你有一个混合内容的Array,不要使用extract()

function foo($data){
    extract($data);
    echo "<br />apple:" . (isset($apple)?$apple:$data[0]);
    echo "<br />ball:" . (isset($ball)?$ball:$data[1]);
    echo "<br />cat:" .  (isset($cat)?$cat:$data[2]);
}

您可以在这里看到陷阱。如果数据有更多或更少的索引,或者顺序不正确,你会得到一个失败的索引或不正确的值。

【讨论】:

  • 问题是我不知道接下来会发生什么,苹果、球、飞机... :(
  • 有什么方法可以格式化数据?数据是如何呈现给您的?
猜你喜欢
  • 2021-11-06
  • 2015-07-13
  • 2010-10-08
  • 1970-01-01
  • 2017-05-14
  • 2014-01-06
  • 2013-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多