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


Is this a mutidimensional array that I can search for key-value?

上下文:我是一个新手程序员,可能缺乏完整的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" 
    } 
  } 

这是使用以下命令将 SimpleXML对象转换为数组的结果:

<?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) 如果它不是一个多维数组,我是否需要以某种方式转换它,或者有一种方法可以搜索特定的键值对(主场球队->曼联)?

我可以举出很多我尝试过但没有奏效的例子,但我认为最好先问一下数组中是否有我误解的东西。

每个人似乎都加入了"这不是一个多维数组"的潮流。

但这正是你问的,所以我会尝试回答你的问题:

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) 如果它不是一个多维数组,我是否需要以某种方式转换它,或者有一种方法可以搜索它以查找特定的键值对(主场球队->曼联)?

无需您仍然可以阅读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;
});
这不是

一个多维数组。它是对象的一维数组

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

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

等。

我希望参考(点击!)对您有所帮助

看起来

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