【问题标题】:How to move a targeted object to the front of an indexed array of objects?如何将目标对象移动到索引对象数组的前面?
【发布时间】:2018-07-31 13:43:05
【问题描述】:

我有一个对象的索引数组,如下所示:

Array
(
    [0] => St Object
        (
            [pId] => 6590153
            [prId] => 5371
            [expirationDate] => 2018-07-10 23:59:59           
            [creationDate] => 2018-01-10 11:58:29
            [pkid] => 12345
            [parentObj] => s Object
                (
                    [id] => 654250
                    [userID] => 776134
                    [pkid] ] => 12345
        )
     [ur] => 5899
         [overAgeRate] => 1.00
    )

    [1] => St Object
        (
            [pId] => 6590154
            [prId] => 5371
            [expirationDate] => 2018-07-10 23:59:59           
            [creationDate] => 2018-01-10 11:58:29
            [pkid] => 12346
            [parentObj] => s Object
                (
                    [id] => 654250
                    [userID] => 776134
                    [pkid] ] => 12346
        )
     [ur] => 58
         [overAgeRate] => 1.00
    )
)

我想根据我的针值重新排列数组。例如$needle=12346

基于此值,第二个对象需要成为第一个元素。结果数组将是:

Array
    (
        [0] => St Object
            (
                [pId] => 6590154
                [prId] => 5371
                [expirationDate] => 2018-07-10 23:59:59           
                [creationDate] => 2018-01-10 11:58:29
                [pkid] => 12346
                [parentObj] => s Object
                    (
                        [id] => 654250
                        [userID] => 776134
                        [pkid] ] => 12346
            )
         [ur] => 58
             [overAgeRate] => 1.00
        )

        [1] => St Object
            (
                [pId] => 6590153
                [prId] => 5371
                [expirationDate] => 2018-07-10 23:59:59           
                [creationDate] => 2018-01-10 11:58:29
                [pkid] => 12345
                [parentObj] => s Object
                    (
                        [id] => 654250
                        [userID] => 776134
                        [pkid] ] => 12345
            )
         [ur] => 5899
             [overAgeRate] => 1.00
        )
    )

我怎样才能以简单的方式做到这一点?

【问题讨论】:

    标签: php arrays sorting object multidimensional-array


    【解决方案1】:

    如果目标对象存在,这些方法会将您的目标对象移动到数组的前面,如果找不到目标,则不移动任何内容。

    方法 #1 (Demo)

    $pkid='12346';
    usort($array,function($a,$b)use($pkid){          // put needle into function scope
            if($a->pkid!=$pkid && $b->pkid!=$pkid){  // neither object matches needle
                return 0;                            // no move
            }
            return $a->pkid==$pkid ? -1 : 1;         // $a or $b matches; appropriately move
        });
    var_export($array);
    

    方法#2:(Demo)

    $pkid='12346';
    foreach($array as $k=>$v){
        if($v->pkid== $pkid){                        // found the needle
            unset($array[$k]);                       // remove object from array
            array_unshift($array,$v);                // reinsert it at the front (reindex keys)
            break;                                   // no reason to continue iterating
        }
    }
    var_export($array);
    

    【讨论】:

    • 我用过下面的代码,效果很好。 $pkid='12346'; foreach ( $arr as $k=>$v ) { $pkId = $v->pkid; if($pkId == $pkid) { unset($arr[$k]); array_unshift($arr,$v);休息; }
    • array_splice() 换成unset() 肯定是更好的选择。我已经更新了我的答案。我不建议使用区分大小写的方式来区分相似的变量——这会使你的代码更难阅读。我还有另一个原则规定不应声明一次性变量——出于这个原因,我没有在更新的答案中声明$pkId
    猜你喜欢
    • 2021-12-15
    • 2016-04-16
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多