【问题标题】:Multidimensional array keys to variable变量的多维数组键
【发布时间】:2019-07-24 12:42:59
【问题描述】:

遗憾的是我还没有找到任何解决方案。

我有一个如下所示的多维数组:

Array
(
    [0] => Array
        (
            [Symbol] => CASY.US
            [Position] => 169873920
        )
    [1] => Array
        (
            [Symbol] => US500
            [Position] => 168037428
        ) )

现在我想将内部数组的键名写入变量中,这样我就有了这些变量的值:

$col1 = "Symbol"
$col2 = "Position"

我怎样才能做到这一点?不知何故有几个 foreach 循环?

背景:之后我想检查列是否具有正确的验证名称。

提前致谢!

【问题讨论】:

  • 整个数组看起来都一样吗?还是某处有第三把钥匙?
  • 你打算如何用大量未知的变量名来验证这些?您在验证什么,您可能可以使用更适合此的 array_intersect_keyarray_diff_key

标签: php arrays multidimensional-array foreach key


【解决方案1】:

老实说,我会这样做:

$required = array_flip(['Symbol', 'Position']); //flip because I am lazy like that ['Symbol'=>0, 'Position'=>1]
foreach($array as $subarray){
     $diff = array_diff_key($required, $subarray); 
     //prints any keys in $required that are not in $subarray
     print_r($diff);
     if(!empty($diff)){ 
          //some required keys were missed
     }
}

虽然不清楚您如何验证这些原因,但正如我在此评论中所解释的那样

它仍然没有解决问题,因为你真的无法知道键是什么(如果它们不统一的话)。所以在我的例子中foo$col3 如果我以后有bar 那是$col4 如果下次订单不同怎么办......他们将是不同的数字。当然这是一些假设,但你不能保证。

通过动态编号键,如果数组的结构发生变化,您将不知道这些动态变量包含什么,因此不知道如何验证它们。

因此,即使您设法完成这项工作,如果您的数据发生变化,您也必须重新访问代码。

无论如何,如果您想查看每个数组是否包含所需的键,我在上面放置的方法将是一种更明智的方法。

【讨论】:

    【解决方案2】:

    循环嵌套并使用“col”和一个整数将键保存到一个数组中,以后可以(如果您真的必须提取),但我建议将它们保留在数组中。

    foreach($array as $subarray){
        $i = 1;
        foreach($subarray as $key => $val){
            $keys["col" . $i] = $key;
            $i++;
         }
         break; // no need to keep looping if the array is uniform
    }
    //if you must:
    extract($keys);
    

    https://3v4l.org/ALVtp


    如果子数组不相同,那么您需要循环所有子数组并查看密钥是否已保存,如果未保存则跳过它。
    $keys =[];
    $i = 1;
    foreach($array as $subarray){
        foreach($subarray as $key => $val){
            if(!in_array($key, $keys)){
                $keys["col" . $i] = $key;
                $i++;
            }
         }
    }
    var_dump($keys);
    //if you must:
    extract($keys);
    var_dump($col1, $col2, $col3);
    

    https://3v4l.org/EklPK

    【讨论】:

    • 数组必须是统一的,在接下来的迭代中,键只会不断堆积。 $col1 = 'Symbol', $col2 = 'Position' 然后循环 2 $col3 = 'Symbol', $col4 = 'Position' $col4='foo' 然后循环 3 $col6='Symbol' etc...,所以现在“符号”不再奇怪了。检查它们是否不统一将是一场噩梦。到第 8 次迭代时,您不知道键可能是什么或它们代表什么。作为回答者“呃”这不是你的错,我只是认为这是一种有缺陷的方法,无论它是如何完成的。
    • @ArtisticPhoenix 不,任何一个答案中的键都不会叠加。第一个有break;,只循环一次,第二个有if(!in_array())
    • @MichaelH。如果对您有帮助,请随时接受答案
    • 我错过了if(!in_array()),但它仍然不能解决问题,因为你真的无法知道键是什么(如果它们不统一的话)。所以在我的例子中foo$col3 如果我有bar 之后那是$col4 如果下一次的顺序不同怎么办......他们将是不同的数字。当然这是一些假设,但你不能保证。
    • @ArtisticPhoenix OP 询问如何获取密钥名称。我不知道 OP 将它用于什么,因为答案中没有提到它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-23
    • 2017-02-25
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 2021-03-21
    • 2023-03-26
    相关资源
    最近更新 更多