【问题标题】:Is there a way to get a named key/value from SUBARRAY without knowing the main key?有没有办法在不知道主键的情况下从 SUBARRAY 获取命名键/值?
【发布时间】:2016-12-27 11:49:50
【问题描述】:

简短:有没有办法在不知道主键的情况下从 SUBARRAY 获取命名键/值?

长:

我有一个 foreach 循环,可以提取文本文件并将它们转换为单独的/单个数组(重置每个文件之间的数组)...

示例:

Array
(
    [Blah Blah] => Array
        (
            [number] => 10
            [name] => nameBlah
            [image] => 
        )
)


Array
(
    [pinkblue597] => Array
        (
            [number] => 18
            [name] => nameBlah68
            [image] => 
        )
)

(转化为数组的第一部分被进程的多个部分使用,所以我不想添加不必要的代码)

我想提取“name”和“number”的值,但是我事先不知道键的值/格式.. - 示例:pinkblue597

如果我这样做print_r,我确实可以看到我想要的数组...

print_r($found,true)."\n";

但如果我这样做,$name=$found[0]; 我不会得到 "$name" 的结果...

或

如果我这样做,$name=$found[0]["name"]; 我没有得到 "$name" 的结果...

我可以通过 foreach 循环来做到这一点,但它似乎效率低下......

PS 这个数组中只有一个(未知)键和一个子数组。子数组总是一样的。

已编辑:使代码更易于查看(忘记这样做了)

【问题讨论】:

  • 您可以使用array_keys(),因此您可以使用数字键访问您的数组。
  • 我强烈建议您在帮助中心查看How to create a Minimal, Complete, and Verifiable example,这样您的问题就不会再被否决。您在这里的一个关键问题是您提供的示例数组(除了没有正确格式化为代码)没有展示您要解决的实际问题。因此,没有合理的方法可以从您所拥有的东西中推断出您的实际期望。
  • 一些改进您的问题的建议是使用类似var_export() 而不是print_r() 来提供您的数组的最小、完整和可验证的示例以及您对它们的期望。由于var_export 将返回实际有效的 PHP 代码,而不是一些任意的数据文本表示。
  • 是什么让你觉得foreach效率低下?

标签: php sub-array


【解决方案1】:

如果数组的形成一直都是一样的......

然后一个(嵌套的)foreach 循环将就足够了,以下面的示例为例,

<?php

$a = [
    'somethingUnknown13582563' => [
        'name' => 'name',
        'number' => 15
    ],

    'somethingUnknown2' => [
        'name' => 'another name',
        'number' => 24
    ]
];

foreach ($a as $key => $subArray) {
    foreach ($subArray as $subKey => $value) {
        echo $subArray[$subKey] . '<br>';
    }
}

?>

输出

name
15
another name
24

或者...

你可以使用array_values,

<?php

$a = [
    'somethingUnknown13582563' => [
        'name' => 'first name',
        'number' => 15
    ],

    'somethingUnknown2' => [
        'name' => 'name',
        'number' => 24
    ]
];

$a = array_values($a);

echo $a[0]['name'];

?>

这会将第一个关联数组转换为数字索引并希望如此,

array(
      0 => array(
             'name' => 'first name', 
             'number' => 15, 
           ), 
      1 => array(
             'name' => 'name', 
             'number' => 24, 
           )
)

【讨论】:

  • 请注意,他们并不是说有两个数组嵌套在一个数组中。他们说有两个数组,每个数组都是多维的,但只包含一个元素。所以$a1 = [['name' =&gt; 'foo']]; $a2 = [['name' =&gt; 'bar']]; 而不是$a = [['name' =&gt; 'foo'],['name' =&gt; 'bar']]
  • 没问题,但也考虑到他们表达的担忧是围绕 foreach 和效率(虽然不一定效率低下)使用array_values 不会更好反正。我认为他们主要关心的是轻松取消引用数组。
  • $subArray[$subKey] 更简单地编写/访问为$value。
【解决方案2】:

如果您只想立即丢弃它,我不确定为什么要首先创建嵌套数组,但是由于该数组似乎只有一个元素,而您只关心该元素,所以您可以简单使用array_pop

$a = [
    'somethingUnknown13582563' => [
        'name' => 'first name',
        'number' => 15
    ],
];

$data = array_pop($a);
echo $data['name']; // gives you 'first name'

请注意,array_pop 具有破坏性。因此,如果您不想要这种行为,您可以改用 end 之类的东西。

$data = end($a); // same effect as array_pop but non-destructive
echo $data['name']; // also gives you 'first name'

话虽如此,foreach 构造不一定效率低下。我相信您真正关心的是寻找一种更简单的方法来取消引用嵌套数组。在您的情况下,最简单的方法是使用 end($a)['name'] 之类的东西,它可以为您提供您正在寻找的那种直接的取消引用。

【讨论】:

    【解决方案3】:

    你可以使用array_map()来实现这个...

    array_map — 将回调应用于给定数组的元素。这将通过回调函数循环所有数组元素,您可以打印子数组中存在的每个元素..

    <?php 
    $myArry = array(
                  'Blah Blah' => array(
                         'number' => 10, 
                         'name' => 'Blah Blah 1', 
                       ), 
                  'pinkblue597' => array(
                         'number' => 15, 
                         'name' => 'Blah Blah 2', 
                       )
            );
    
    array_map(function($arr){ 
        echo 'Name : '.$arr['name'].'<br>'; 
        echo 'Number : '.$arr['number'].'<br>';     
    },$myArry);
    
    ?>
    

    这会给你:

    Name : Blah Blah 1
    Number : 10
    Name : Blah Blah 2
    Number : 15
    

    【讨论】:

      猜你喜欢
      • 2015-01-23
      • 1970-01-01
      • 2011-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-12
      相关资源
      最近更新 更多