【问题标题】:Problem understanding 2d array search in PHP问题理解 PHP 中的二维数组搜索
【发布时间】:2020-08-01 23:37:08
【问题描述】:

这是一个带有一些值的简单二维数组

$array[0][0] = 1;
$array[0][1] = 2;
$array[1][0] = 3;
$array[1][1] = 4;

我想找到值最大的数组元素的键。

这是返回密钥的代码:

$index = array_search(max($array), $array);

它运行良好,但它只返回密钥的“最后”部分。 所以在我的数组中,最大值 (4) 的元素是 $array[1][1] 所以 $index 返回 1 我知道这是该元素的键,但我怎么知道这是否是元素 [0][ 1] 或 [1][1],因为这两个元素都有键 [1]? 我如何获得“完整”密钥([1][1]),所以在我的情况下是 [1] 和 [1]。

我想我在像这样的多维 PHP 数组的工作方式中遗漏了一些东西,我希望有人能帮助我理解它们。

更新 #2

现在我对 max() 更加困惑了。我试过了

$array[0][0] = 5323;
$array[0][1] = 5346;
$array[0][2] = 5424;
$array[1][0] = 6000;
$array[1][1] = 5412;
$array[1][2] = 5543;
$array[2][0] = 5651;
$array[2][1] = 7000;
$array[2][2] = 5254;

var_dump(max($array));

它返回 subbaray,它没有 7000 作为我预期的结果之一。毕竟这是这个数组中的最大值,所以现在我完全糊涂了。

【问题讨论】:

  • 如果说 $array[0][1] = 7;,你仍然会在 max($array) 中得到 [3,4]。我希望您了解 max with arrays 是如何工作的。 array_search 返回 max() 选择的子数组的索引
  • 不,我不明白在那个例子中我怎么能得到 [3,4] 作为 max 的结果。当我使用 max($array) 我只是得到键,所以如果元素是 $array[43][54] 我得到“54”部分是键,但我还需要“43”部分,父键或不管它可以叫什么,我不明白如何得到它。
  • set $array[0][0] = 5; $array[0][1] = 7; 你会得到 0 而不是 1 如你所愿。打印max($array) 看看它返回了什么
  • 好的,所以在我的示例中 $index 不会返回密钥的最后一部分,而是返回第一个。我现在明白了,但不明白它是如何做到的以及如何获得密钥的第二部分?我现在看到 max() 返回包含每个“列”的所有最大值的数组,这是我正在寻找的关键的第二部分,但现在我很纠结,我不明白如何组合到获取该元素的完整键 ([x][y]) 以及当 needle 参数为数组时 array_search 如何仅返回一个结果(返回 max())
  • 现在我对 max() 更加困惑了。我试过$array[0][0] = 5323;$array[0][1] = 5346;$array[0][2] = 5424;$array[1][0] = 6000;$array[1][1] = 5412;$array[1][2] = 5543;$array[2][0] = 5651;$array[2][1] = 7000;$array[2][2] = 5254;var_dump(max($array));它返回没有700的subbaray .毕竟这是这个数组中的最大值,所以现在我完全糊涂了

标签: php arrays multidimensional-array


【解决方案1】:

您的样本数据中有 8 个索引,其中一半是 1,因此获得 1 并不能证明一切正常。

让我们拆分你的代码:

max($array)

由于$array是二维数组,所以关注rules apply

  1. 多个不同长度的数组,max返回最长的

    $val = max(array(2, 2, 2), array(1, 1, 1, 1)); // array(1, 1, 1, 1)
    
  2. 多个相同长度的数组从左到右进行比较

    $val = max(array(2, 4, 8), array(2, 5, 1)); // array(2, 5, 1)
    

因此您得到[3, 4],因为1 小于3。请比较:

$array[0][0] = 1;
$array[0][1] = 9999999;
$array[1][0] = 3;
$array[1][1] = 4;
print_r(max($array));
Array
(
    [0] => 3
    [1] => 4
)
$array[0][0] = 1;
$array[0][1] = 2;
$array[1][0] = 0;
$array[1][1] = 9999999;
print_r(max($array));
Array
(
    [0] => 1
    [1] => 2
)

因此,您选择了一个遵循不一定符合您的规范的规则的子数组。由于您的示例数据,您的代码纯属偶然。

【讨论】:

  • 现在我明白我的示例中的 $index 不返回键的“最后一部分”而是第一个(它从 $array[x][y] 返回 X)。那么如何获得该密钥的第二部分,Y?
  • 它返回键的唯一部分,因为您不再在完整数组中搜索,而是在任意子数组中搜索(不一定是具有最大值的子数组)。
  • 好的,所以在我的例子中,第一个 max(array) 给了我每列都有最大值的子数组,列键作为键。之后 array_search 使用该子数组作为指针在数组中搜索并返回什么的键......?现在我不明白 array_search 在这里的外观和发现。这是否意味着这段代码没有给我想要的东西?如果不是,我如何在 $array[x][y] 中同时获得 X 和 Y 以获得 $array 中的最大值
  • "给我每列都有最大值的子数组" 不,它没有。我在回答中解释了它(要点 1 和 2)。 “子数组作为针在数组中搜索并返回什么的键......” 大原始数组中该子数组的键。 “这是否意味着这段代码没有给我想要的东西?”对于“纯偶然的工作”,我的基本意思是:它适用于这个数据集,但对于其他一切都是错误的。这就像用 $a + $b 计算乘法并用 1 和 1 进行测试。
  • 哦,好的,问题是 max() 在二维数组上使用时不会给我最大值的元素?还是代码的其他部分有问题?找到具有最大值的二维数组元素的正确方法是什么? (如果可能没有具有 O(n^2) 时间复杂度的双循环)
猜你喜欢
  • 2023-03-06
  • 2018-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-09
  • 2014-06-04
  • 2014-06-26
  • 1970-01-01
相关资源
最近更新 更多