这是一个多维数组,我可以搜索键值吗?

时间:2015-01-16 09:31:17

标签: php multidimensional-array

背景:我是一名新手程序员,可能缺乏完整的360度能力来提出正确的问题。

问题:

我有一个数组$sortablepast

array(3) { 
[0]=> object(SimpleXMLElement)#265 (6) { 
    ["Date"]=> string(25) "2014-12-28T08:15:00-08:00" 
    ["Id"]=> string(5) "78065" 
    ["HomeTeam"]=> string(7) "Man Utd" 
    ["AwayTeam"]=> string(9) "Leicester" 
    ["HomeGoals"]=> string(1) "2" 
    ["AwayGoals"]=> string(1) "2" 
  } 

[1]=> object(SimpleXMLElement)#264 (6) { 
    ["Date"]=> string(25) "2014-12-28T08:15:00-08:00" 
    ["Id"]=> string(5) "78064" 
    ["HomeTeam"]=> string(8) "Man City" 
    ["AwayTeam"]=> string(7) "Burnley" 
    ["HomeGoals"]=> string(1) "3" 
    ["AwayGoals"]=> string(1) "3" 
  } 

[2]=> object(SimpleXMLElement)#266 (6) { 
    ["Date"]=> string(25) "2014-12-28T08:15:00-08:00" 
    ["Id"]=> string(5) "78085" 
    ["HomeTeam"]=> string(9) "Newcastle" 
    ["AwayTeam"]=> string(7) "Everton" 
    ["HomeGoals"]=> string(1) "1" 
    ["AwayGoals"]=> string(1) "1" 
    } 
  } 

这是使用以下函数将SimpleXMLobject转换为数组的结果:

<?php   $xmlpast = new SimpleXMLElement("xml_past_epl.xml", 0, TRUE);         
$sortablepast = array();
foreach($xmlpast->Match as $node) {
$sortablepast[] = $node;
}
?>

我已将其转换为数组,以便使用usort按字母顺序对其进行排序。

我正在尝试运行if语句,以便在"HomeTeam" = "Man Utd"时它将回显"Man Utd are at home"

从“如何在多维数组中搜索键值对”这一问题的许多答案(包括我提出的问题)我尝试使用in_arrayisssetarray_maparray_filter来自SO的答案,但似乎都没有效果。我似乎能够访问key = '0', '1' or '2'而不是key = 'Date, 'Id'

的值

我想问一下 a)这是一个多维数组,还是实际上是一个对象数组?我没有足够的知识和经验来了解差异是否显着 b)如果它不是一个多维数组,我是否需要以某种方式转换它,或者有一种搜索特定键值对的方法(HomeTeam-&gt; Man Utd)?

我可以提供许多我尝试过但没有效果的例子,但我认为最好首先询问数组中是否存在我误解的内容。

3 个答案:

答案 0 :(得分:2)

每个人似乎都跳上了“这不是一个多维数组”。潮流。

但这正是你所要求的,所以我会尽力回答你的问题:

a)这是一个多维数组,还是实际上是一个对象数组?我没有足够的知识和经验来了解差异是否显着

正如您所注意到的,它实际上是一个对象数组。你可以看到这个因为

array(3) { 
    [0]=> object(SimpleXMLElement)#265 (6) { 
    ....
} 

本来是

array(3) { 
    [0]=> array(6) { 
    ....
} 

如果XMLObject也被转换为数组,那么它将是一个多维数组。

为什么它是带对象的数组? 因为你还没有自己转换节点。 这就是你要做的:

$sortablepast = array();
foreach($xmlpast->Match as $node) {
    $sortablepast[] = $node; // $node is not an array, all nodes within the XML are also SimpleXMLElements
}

差异是否显着?

是的,但是您不需要在匹配中订购或做任何特殊事情,因此也不需要将其转换为数组。所以你只需要在SimpleXMLElement上进行正确的操作(见下文)。

b)如果它不是多维数组,我是否需要以某种方式对其进行转换,或者有一种搜索特定键值对的方法(HomeTeam-&gt; Man Utd)?

无需您仍然可以阅读SimpleXMLElement

例如:

foreach ($sortablepast as $match) {
   //$match is a SimpleXMLElement
   if ($match->HomeTeam == 'Man Utd') {
       echo 'Man Utd are at home';
   }
}

如何排序:

//Sort by HomeTeam alphabetically
usort($sortablepast, function($a, $b)
{
    if ($a->HomeTeam == $b->HomeTeam) {
        return 0;
    }
    return ($a->HomeTeam < $b->HomeTeam) ? -1 : 1;
});

答案 1 :(得分:0)

这不是多维数组。它是对象的单维数组

你有三个元素的数组,其中每个元素都是SimpleXMLElement类的对象。

echo $array[2]->HomeTeam;
echo $array[1]->Id;

我希望Reference (click!)会帮助你

答案 2 :(得分:0)

看起来你有一个对象数组而不是多维数组。数组大小为3,请参见第一行代码。