将具有特定值的元素移动到维数组的末尾

时间:2020-03-21 13:11:21

标签: php arrays

原始数组

 $sonuc['rec'][0]['m_unseen'] = 1;
 $sonuc['rec'][0]['user_id'] = 234;
 $sonuc['rec'][0]['id'] = 133;
 $sonuc['rec'][0]['last_updated'] = date();
 $sonuc['rec'][0]['user']['unseen'] = 0;
 $sonuc['rec'][0]['user']['id'] = 234;

 $sonuc['rec'][1]['m_unseen'] = 0;
 $sonuc['rec'][1]['user_id'] = 234;
 $sonuc['rec'][1]['id'] = 134;
 $sonuc['rec'][1]['last_updated'] = date();
 $sonuc['rec'][1]['user']['unseen'] = 0;
 $sonuc['rec'][1]['user']['id'] = 234;

 $sonuc['rec'][2]['m_unseen'] = 0;
 $sonuc['rec'][2]['user_id'] = 234;
 $sonuc['rec'][2]['id'] = 135;
 $sonuc['rec'][2]['last_updated'] = date();
 $sonuc['rec'][2]['user']['unseen'] = 0;
 $sonuc['rec'][2]['user']['id'] = 234;

 $sonuc['rec'][3]['m_unseen'] = 1;
 $sonuc['rec'][3]['user_id'] = 234;
 $sonuc['rec'][3]['id'] = 136;
 $sonuc['rec'][3]['last_updated'] = date();
 $sonuc['rec'][3]['user']['unseen'] = 0;
 $sonuc['rec'][3]['user']['id'] = 234;

预期结果

 $sonuc['rec'][0]['m_unseen'] = 1;
 $sonuc['rec'][0]['user_id'] = 234;
 $sonuc['rec'][0]['id'] = 133;
 $sonuc['rec'][0]['last_updated'] = date();
 $sonuc['rec'][0]['user']['unseen'] = 0;
 $sonuc['rec'][0]['user']['id'] = 234;

 $sonuc['rec'][1]['m_unseen'] = 1;
 $sonuc['rec'][1]['user_id'] = 234;
 $sonuc['rec'][1]['id'] = 136;
 $sonuc['rec'][1]['last_updated'] = date();
 $sonuc['rec'][1]['user']['unseen'] = 0;
 $sonuc['rec'][1]['user']['id'] = 234;

 $sonuc['rec'][2]['m_unseen'] = 0;
 $sonuc['rec'][2]['user_id'] = 234;
 $sonuc['rec'][2]['id'] = 134;
 $sonuc['rec'][2]['last_updated'] = date();
 $sonuc['rec'][2]['user']['unseen'] = 0;
 $sonuc['rec'][2]['user']['id'] = 234;

 $sonuc['rec'][3]['m_unseen'] = 0;
 $sonuc['rec'][3]['user_id'] = 234;
 $sonuc['rec'][3]['id'] = 135;
 $sonuc['rec'][3]['last_updated'] = date();
 $sonuc['rec'][3]['user']['unseen'] = 0;
 $sonuc['rec'][3]['user']['id'] = 234;

我正在尝试将所有 m_unseen 值为0的元素移到数组的末尾。

我尝试过但无法获得预期的结果

function moveElement(&$array, $a, $b) {
    $out = array_splice($array, $a, 1);
    array_splice($array, $b, 0, $out);
}

    $keys = array_keys(array_column($sonuc['rec'], 'm_unseen'), 0);

     foreach ($keys as $key) {

         moveElement($sonuc['rec'], $key, $say);

     }

有什么主意吗?

3 个答案:

答案 0 :(得分:1)

您可以将usort函数与自定义回调一起使用来实现技巧
该函数有两个参数,即数组(通过引用传递)和带有两个元素的回调。您将比较回调中的两个元素。

在这里,我们简单地将一个“ m_unseen”减去另一个,因为它们是数字。如果是另一种类型,我们将需要返回一个正整数或负整数,或者如果它们等于则返回0,因为这就是usort函数的期望。

(( true * false ))

Here is a sandbox for you to test it out

答案 1 :(得分:0)

*funcp具有自定义排序功能就足够了:

usort

答案 2 :(得分:0)

您只需将具有非零值的m_unseen移到前面,就可以在指针变量的帮助下将零值交换到后面。

<?php

$ptr = 0;

foreach($sonuc['rec'] as $key => $value){
 if($value['m_unseen'] != 0){
    $temp = $sonuc['rec'][$ptr];
    $sonuc['rec'][$ptr++] = $value;
    $sonuc['rec'][$key] = $temp;
 }
}

演示https://3v4l.org/o1c5R