移动特定索引';s在数组中根据内部值排列到前面


Shifting specific index's in array to front based on value inside

我有以下数组。

{
  "flow":[
    {
      "tasks":[
        { "id":"1", "uid":"bryan" },
        { "id":"2", "uid":"eric" }
      ]
    },
    {
      "tasks":[
        { "id":"1", "uid":"bryan" },
        { "id":"2", "uid":"eric" }
      ]
    },
    {
      "tasks":[
        { "id":"1", "uid":"bryan" },
        { "id":"2", "uid":"eric" }
      ]
    },
    {
      "tasks":[
        { "id":"1", "uid":"bryan" },
        { "id":"2", "uid":"eric" },
        { "id":"3", "uid":"eric" },
        { "id":"4", "uid":"bryan" }
      ]
    }
  ]
}

假设我是eric。如果我是eric,我将尝试将ericuid的所有项移动到tasks数组的前面。

因此,数组最终将显示为以下样子:

{
  "flow":[
    {
      "tasks":[
        { "id":"2", "uid":"eric" },
        { "id":"1", "uid":"bryan" }
      ]
    },
    {
      "tasks":[
        { "id":"2", "uid":"eric" },
        { "id":"1", "uid":"bryan" }
      ]
    },
    {
      "tasks":[
        { "id":"2", "uid":"eric" },
        { "id":"1", "uid":"bryan" }
      ]
    },
    {
      "tasks":[
        { "id":"2", "uid":"eric" },
        { "id":"3", "uid":"eric" },
        { "id":"1", "uid":"bryan" },
        { "id":"4", "uid":"bryan" }
      ]
    }
  ]
}

我曾试图制作一个函数来实现它,但由于某种原因,它没有按我想要的方式工作。有人知道我做错了什么吗?

function reorder_flow($flow, $uid)
{   
    foreach($flow as &$step)
    {   
        //step is the array with tasks
        $tasks = $step['tasks'];
        $new_tasks = array();
        foreach($tasks as $key => $t)
        {
            if($t['uid'] == $uid)
            {
                $new_tasks = $new_tasks + $t;
                unset($tasks[$key]);
            }
        }
        $step['tasks'] = $new_tasks + $step['tasks'];
    }
    return $flow;
}

这是一个遍历/排序问题。

$json = <<<JSON
{
  "flow":[
    {
      "tasks":[
        { "id":"1", "uid":"bryan" },
        { "id":"2", "uid":"eric" }
      ]
    },
    {
      "tasks":[
        { "id":"1", "uid":"bryan" },
        { "id":"2", "uid":"eric" }
      ]
    },
    {
      "tasks":[
        { "id":"1", "uid":"bryan" },
        { "id":"2", "uid":"eric" }
      ]
    },
    {
      "tasks":[
        { "id":"1", "uid":"bryan" },
        { "id":"2", "uid":"eric" },
        { "id":"3", "uid":"eric" },
        { "id":"4", "uid":"bryan" }
      ]
    }
  ]
}
JSON;
$flow = json_decode($json, true);
array_walk($flow['flow'], function(&$flowItem, $key){
    usort($flowItem['tasks'], function($a, $b){
        $aIsMatch = $a['uid'] === 'eric';
        $bIsMatch = $b['uid'] === 'eric';
        if ($aIsMatch && $bIsMatch) {
            return 0;
        }
        if ($aIsMatch) {
            return -1;
        }
        if ($bIsMatch) {
            return 1;
        }
        // Fallback sorting criteria - you could use something else or just return 0
        return strcasecmp($a['uid'], $b['uid']);
    });
});

echo json_encode($flow, JSON_PRETTY_PRINT);

请尝试以下操作:

function sortByUID(&$array, $uid) {
    array_walk ($array, function($obj) use($uid) {
        uasort($obj->tasks, function($a, $b) use($uid)  {
            return $a->uid == $uid ? -1 : 1;
        });
    }); 
}
sortByUID($data->flow, 'eric');

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

我希望这会有所帮助。

注意事项:

  • +不能以这种方式与阵列一起工作

  • json_decode应该将第二个参数设置为true以获得嵌套数组

然后在前臂上试试这个:

//step is the array with tasks
$new_tasks=array();
foreach($step['tasks'] as $t){
   if($t['uid'] == $uid){
      array_unshift($new_tasks,$t);
   } else {
      array_push($new_tasks,$t);
   }
}
$step['tasks'] = $new_tasks;