【问题标题】:Get closest smaller array key of a multidimensional array获取多维数组的最接近的较小数组键
【发布时间】:2021-04-29 14:34:10
【问题描述】:

我有一个数组$curvepoint,其结构如下:

Array
(
    [0] => Array
        (
            [ID] => 57587
            [Pos0] => 1
        )
    [1] => Array
        (
            [ID] => 57588
            [Pos0] => 2
        )

    [2] => Array
        (
            [ID] => 57589
            [Pos0] => 22
        )

    [3] => Array
        (
            [ID] => 57590
            [Pos0] => 39
        )
)

现在我想获取与值 [Pos0] 和给定数字相关的最接近的 smaller 数组键。

示例:

如果我有变量$number = 20,则循环应该返回1,因为20 中最接近的较小[Pos0] 值将是[Pos0] => 2,它存储在array key 1 中。

我非常不确定如何获得结果。我尝试在 foreach 循环中使用 array_slice 和 array_intersect 的组合。

原始尝试:

$number = 20 

foreach ($curvepoint as $test) {

    $two_nearest = array_slice(array_intersect(array_keys($test['Pos0']),range(0,$number)), -2);
    $less_near = $test['Pos0'][$two_nearest[0]];

    echo $less_near;
}

修改后的代码:

$value = 10;

function findClosestLowerPosition(array $curvepoint , int $value): ?int
{
    $lowerPositions = array_filter(
        array_column($curvepoint , 'Pos0'),
        function ($a) use ($value) {
            return $a < $value;
        }
    );
    if (empty($lowerPositions)) {
        return null;
    }

}

print_r($lowerPositions);

【问题讨论】:

  • 您已发布规范,但您的帖子中没有问题或问题描述。您是否尝试过自己解决这个问题?虽然我们很乐意在您遇到困难时为您提供帮助,但您应该自己做出努力。如果您尝试过某事,请编辑问题以展示您的努力,并解释它在哪里以及如何未能达到您想要的效果。
  • 当然我已经尝试了很多,但我什至没有接近结果。无论如何,我已经发布了我的尝试/想法。
  • 你已经完全陷入了一次做所有这些事情,嵌套数组函数没有一个清晰的想法。如果将其分解为较小的问题,则更容易找到解决方案。第 1 步:从数组中提取 Pos0 的所有值。第 2 步:找到最接近的较小值(排序会有所帮助)。第三步:在原始数组中的Pos0下找到具有该值的元素。尝试为每个步骤编写代码,不要担心将其优化为更短的解决方案。
  • Pos0 = 22 不等于该数字,因此您需要一个范围,例如该数字应该低多少或高多少,例如,如果 pos0 > 25 拒绝它...如果=19 接受它
  • @KevinGales 指定要选择最接近的 lower 值。这是明确的。

标签: php


【解决方案1】:

建议的解决方案:

/**
 * Searches for the index of an element that has the closest of all
 * the lower values than the specified one.
 *
 * @return int|null Numeric position of the closest lower element if found,
 * NULL otherwise
 */
function findClosestLowerPosition(array $curvepoints, int $value): ?int
{
    $lowerPositions = array_filter(
        array_column($curvepoints, 'Pos0'),
        function ($a) use ($value) {
            return $a < $value;
        }
    );
    if (empty($lowerPositions)) {
        return null;
    }

    rsort($lowerPositions);
    $closestPosition = $lowerPositions[0];
    foreach ($curvepoints as $key => $curvepoint) {
        if ($curvepoint['Pos0'] === $closestPosition) {
            return $key;
        }
    }
}

它是如何工作的:

  • 第一步获取所有较低位置的值。这是通过首先从array_column 提取每个Pos0 值来实现的。该函数的结果是一个简单的数值数组,然后将其作为参数传递给array_filter,它只过滤低于指定值的值。
  • 之后我们检查是否有任何更低的值 - 如果没有找到,我们过滤的数组将为空。在这种情况下,我们返回 null 以指示这样的值不存在。
  • 一旦我们有了较低的值,我们就以相反的顺序(从大到小)对它们进行排序,以便将最接近的值放在数组的第一个位置,然后我们通过访问第一个索引来获得它(总是0 用于 PHP 自动生成的数组)。
  • 最终,我们迭代我们的原始数组以定位其值与最接近的元素匹配的元素。一旦找到匹配项,我们就会返回该元素的键。

请注意,整个算法假定Pos0 不能有重复值。如果您的元素可以具有相同的位置值,那么您需要确定如何打破关系的规则。

【讨论】:

  • 感谢您的帮助。我尝试理解/使用您的代码。我有问题。如果我以$value = 10;print_r($lowerPositions); 为例,我没有得到任何结果。这种行为的原因是什么?
  • @Berstos 你把那条线放在哪里了?您使用了哪些输入值?
  • 我已经用代码示例编辑了我的初始帖子。
  • @Berstos 该变量仅存在于函数内部。如果您有兴趣查看它的外观,则需要将该调试放入其中。然后你必须实际调用该函数。您可能想了解variable scope
  • @Berstos 这是live test,您可以在其中看到它是如何完成的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
  • 2014-05-22
  • 1970-01-01
  • 1970-01-01
  • 2012-07-21
  • 2019-04-14
相关资源
最近更新 更多