如何将包含特定值的数组推到最后一个位置?

时间:2018-11-23 10:28:39

标签: php arrays sorting

这是我的数组,我希望username始终位于开头,password始终位于结尾。

  array(5) {
  [0]=>
  array(8) {
    ["fieldName"]=>
    string(5) "email"
    ["type"]=>
    string(6) "string"
    ["scale"]=>
    int(0)
    ["length"]=>
    int(191)
    ["unique"]=>
    bool(true)
    ["nullable"]=>
    bool(false)
    ["precision"]=>
    int(0)
    ["columnName"]=>
    string(5) "email"
  }
  [1]=>
  array(8) {
    ["fieldName"]=>
    string(8) "isActive"
    ["type"]=>
    string(7) "boolean"
    ["scale"]=>
    int(0)
    ["length"]=>
    NULL
    ["unique"]=>
    bool(false)
    ["nullable"]=>
    bool(false)
    ["precision"]=>
    int(0)
    ["columnName"]=>
    string(9) "is_active"
  }
  [2]=>
  array(8) {
    ["fieldName"]=>
    string(8) "password"
    ["type"]=>
    string(6) "string"
    ["scale"]=>
    int(0)
    ["length"]=>
    int(64)
    ["unique"]=>
    bool(false)
    ["nullable"]=>
    bool(false)
    ["precision"]=>
    int(0)
    ["columnName"]=>
    string(8) "password"
  }
  [3]=>
  array(8) {
    ["fieldName"]=>
    string(8) "username"
    ["type"]=>
    string(6) "string"
    ["scale"]=>
    int(0)
    ["length"]=>
    int(25)
    ["unique"]=>
    bool(true)
    ["nullable"]=>
    bool(false)
    ["precision"]=>
    int(0)
    ["columnName"]=>
    string(8) "username"
  }
  [4]=>
  array(9) {
    ["fieldName"]=>
    string(2) "id"
    ["type"]=>
    string(7) "integer"
    ["scale"]=>
    int(0)
    ["length"]=>
    NULL
    ["unique"]=>
    bool(false)
    ["nullable"]=>
    bool(false)
    ["precision"]=>
    int(0)
    ["id"]=>
    bool(true)
    ["columnName"]=>
    string(2) "id"
  }
}

我可以使用以下代码获取包含字段名称password的数组:

$item = $myArray[2];
unset($myArray[2]);
array_push($myArray, $item);

但这实际上不是我想要的。因为密码并不总是键2

2 个答案:

答案 0 :(得分:2)

我没有测试过这个,因为我不想手动将您的数组重新输入为真实代码。

代码使用array_column组成字段名称的平面数组并搜索“密码”。
如果找到它,则会在数组的最后添加一个副本,然后删除原始副本,然后执行array_values重新索引该数组。

$fieldname = array_column($arr, "fieldName");
$password = array_search("password", $fieldname);
$username = array_search("username", $fieldname);


if($password !== false){
    $arr[] = $arr[$password];
    unset($arr[$password]);
}
if($username!== false){
    array_unshift($arr, $arr[$username]);
    unset($arr[$username]);
}
$arr = array_values($arr);


var_export($arr);

答案 1 :(得分:2)

usort将执行您想要的操作。它使用自定义排序功能,将username排在列表的顶部,password排在列表的底部。所有其他值通常都以开始时的顺序结束,尽管这可能是不可预测的。

usort($data, function ($a, $b) {  if ($a['fieldName'] == 'username' || $b['fieldName'] == 'password') return -1;
                                  elseif ($a['fieldName'] == 'password' || $b['fieldName'] == 'username') return 1;
                                  else return 0;
                                });

我用每个条目中只有几个值制作了小的demo on 3v4l.org;因为输出结果是

Array
(
    [0] => Array
        (
            [fieldName] => username
            [type] => string
        )    
    [1] => Array
        (
            [fieldName] => email
            [type] => string
        )    
    [2] => Array
        (
            [fieldName] => isActive
            [type] => boolean
        )    
    [3] => Array
        (
            [fieldName] => id
            [type] => integer
        )    
    [4] => Array
        (
            [fieldName] => password
            [type] => string
        )    
)