【问题标题】:Traverse an array and compare the current key value pair with next one php遍历一个数组并将当前键值对与下一个php进行比较
【发布时间】:2016-07-20 08:15:28
【问题描述】:

我正在尝试比较数组的键值对以比较下一个键值对以找到较低的值。如果找到的值越低,则取消设置并继续前进。但我没有得到准确性,这里做错了什么,请提出建议。这是代码。 这是要比较和评估的数组。

Array
(
[0] => Array
    (
        [com_details] => Array
            (
                [spid] => 6

            )

        [distance] => 13.1 mi
    )

[1] => Array
    (
        [com_details] => Array
            (
                [spid] => 6

            )

        [distance] => 66.2 mi
    )

[2] => Array
    (
        [com_details] => Array
            (
                [spid] => 6

            )

        [distance] => 1.5 mi
    )

[3] => Array
    (
        [com_details] => Array
            (
                [spid] => 7

            )

        [distance] => 188 mi
    )

[4] => Array
    (
        [com_details] => Array
            (
                [spid] => 7

            )

        [distance] => 96.7 mi
    )

[5] => Array
    (
        [com_details] => Array
            (
                [spid] => 7

            )

        [distance] => 3.1 mi
    )

[6] => Array
    (
        [com_details] => Array
            (
                [spid] => 14

            )

        [distance] => 1.8 mi
    )

[7] => Array
    (
        [com_details] => Array
            (
                [spid] => 14

            )

        [distance] => 228 mi
    )

[8] => Array
    (
        [com_details] => Array
            (
                [spid] => 14

            )

        [distance] => 82.2 mi
    )

)

在上面的数组中,我需要比较那些 spid 相同且距离不同的com_details,如果下一个或上一个距离很小,那么另一个将被取消设置并继续进行下一次迭代。但是我失败了到这个终点。

$l=0;
    do{
        $length = count($dispatch_locations1);
        if($length >= $l+1){
            if($dispatch_locations1[$l]['com_details']['spid'] == @$dispatch_locations1[$l+1]['com_details']['spid']){
               if($dispatch_locations1[$l]['distance'] > $dispatch_locations1[$l+1]['distance']){
                   unset($dispatch_locations1[$l]);
                   $l--;
                  $dispatch_locations1 =  array_values($dispatch_locations1);
               } else if($dispatch_locations1[$l]['distance'] < $dispatch_locations1[$l+1]['distance']){
                   unset($dispatch_locations1[$l+1]);
                   $l--;
                  $dispatch_locations1 =  array_values($dispatch_locations1);
      } else if($dispatch_locations1[$l]['distance'] == $dispatch_locations1[$l+1]['distance']){
                   unset($dispatch_locations1[$l+1]);
                   $l--;
                  $dispatch_locations1 =  array_values($dispatch_locations1);
      }
            }
        }
            $l++;
        } while ($l <= count($dispatch_locations1)+1);
    }

在完全迭代后得到这个数组有点错误。

Array
(
[0] => Array
    (
        [com_details] => Array
            (
                [spid] => 6

            )

        [distance] => 1.5 mi
    )

[1] => Array
    (
        [com_details] => Array
            (
                [spid] => 7

            )

        [distance] => 188 mi
    )

[2] => Array
    (
        [com_details] => Array
            (
                [spid] => 14

            )

        [distance] => 1.8 mi
    )

)

在这个结果中,返回的第二个数组距离是 188,这是错误的。

请提出这里做错了什么。

【问题讨论】:

  • 我认为您正在尝试比较字符串,而不是您需要比较浮点数.. 所以尝试在数组中有一些浮点类型的键或将距离转换为它
  • 你也可以使用 usort 而不是 do while php.net/manual/en/function.usort.php
  • ok 会尝试的。你能建议如何实施 usort。
  • 我正在使用我的手机,5 分钟后将参加比赛
  • 让我正确地解决您的问题..您想对数组进行排序,首先按 spid,然后按距离。我说的对吗?

标签: php arrays loops while-loop


【解决方案1】:

您可以通过删减代码来简化整个复杂操作。下面的代码片段演示了如何,但在您开始之前,您可能需要自己尝试和测试它here

此处用于测试的示例数组

<?php

    $arrMain        = array(
        array(
            'com_details'   => array('spid'=> 6),
            'distance'      => "13.1mi",
        ),
        array(
            'com_details'   => array('spid'=> 6),
            'distance'      => "66.2 mi",
        ),
        array(
            'com_details'   => array('spid'=> 6),
            'distance'      => "1.5mi",
        ),
        array(
            'com_details'   => array('spid'=> 7),
            'distance'      => "188.0 mi",
        ),
        array(
            'com_details'   => array('spid'=> 7),
            'distance'      => "96.7 mi",
        ),
        array(
            'com_details'   => array('spid'=> 7),
            'distance'      => "3.1 mi",
        ),
        array(
            'com_details'   => array('spid'=> 14),
            'distance'      => "1.8 mi",
        ),
        array(
            'com_details'   => array('spid'=> 14),
            'distance'      => "228.0 mi",
        ),
        array(
            'com_details'   => array('spid'=> 14),
            'distance'      => "82.2 mi",
        ),
    );

算法

<?php
    $arrSections    = array();

    // SORTING FUNCTION - USED TO SORT ARRAY VALUES BY "distance"
    // IN DESCENDING ORDER...
    function sortByField($prev, $next, $field="distance") {
        $prevVal = floatval(preg_replace("#[a-zA-Z\s\t]*#", "",$prev[$field]));
        $nextVal = floatval(preg_replace("#[a-zA-Z\s\t]*#", "",$next[$field]));
        return $prevVal - $nextVal;
    }

    // BUNDLE ARRAYS WITH SIMILAR spid INTO ONE GROUP
    // THUS CREATING A MULTI-DIMENSIONAL ARRAY WHOSE MAIN KEYS CORRESPOND TO
    // THE spid OF MEMBER ARRAYS IN THE GROUP. 
    foreach($arrMain as $iKey=>$subMain){
        $spID   = $subMain['com_details']['spid'];
        $strID  = $spID; 

        if(!array_key_exists($strID, $arrSections)) {
            $arrSections[$strID] = array();
        }
        $arrSections[$strID][] = $subMain;
    }

    // SORT THE ARRAY SIMPLY BY THE FIELD "distance" IN DESCENDING ORDER
    array_walk($arrSections, function (&$data) {
        usort($data, "sortByField");
    });

    // ARRAY THAT HOLDS THE DESIRED RESULT
    $arrFinal = array();

    // WE KNOW THAT ONLY THE FIRST ITEM IN THE ARRAY IS OF IMPORTANCE TO US
    // SO WE REMOVE ALL OTHER ITEMS EXCEPT THE 1ST...
    foreach($arrSections as $intKey=>&$section){
        array_splice($section, 1);
        $arrFinal[]   = $section[0];

    }
    var_dump($arrFinal);

VAR_DUMP() 的结果

    // var_dump($arrSections); PRODUCES:::
    array (size=3)
      0 => 
        array (size=2)
          'com_details' => 
            array (size=1)
              'spid' => int 6
          'distance' => string '1.5mi' (length=5)
      1 => 
        array (size=2)
          'com_details' => 
            array (size=1)
              'spid' => int 7
          'distance' => string '3.1 mi' (length=6)
      2 => 
        array (size=2)
          'com_details' => 
            array (size=1)
              'spid' => int 14
          'distance' => string '1.8 mi' (length=6)

【讨论】:

  • 将实现这个......还有一件事......如果我们想删除创建的额外数组,即[6] =&gt; Array...[7] =&gt; Array...
  • @SudhanshuSaxena 代码已更新以反映...所做的唯一更改是在代码的底部:从 // 保持所需结果的数组开始的部分 $arrFinal = array(); 直到代码结束...祝您好运和干杯.... ;-)
  • 这个是完美的解决方案。
【解决方案2】:

如果我正确地解决了您的问题,这里是解决该问题的代码..

此代码首先按 spid 然后按距离对数组进行排序:

<?php
usort($dispatch_locations1, function($a, $b) {
    if($a['com_details']['spid'] > $b['com_details']['spid']) {
        return 1;
    } elseif($a['com_details']['spid'] < $b['com_details']['spid']) {
        return -1;
    }

    return (floatval($a['distance']) < floatval($b['distance'])) ? -1 : 1;
});
?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 2021-02-23
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    • 2015-09-19
    相关资源
    最近更新 更多