Php 如果值不为空,则在foreach循环中对数组进行排序

Php 如果值不为空,则在foreach循环中对数组进行排序,php,Php,我有这个foreach循环,我想知道是否有一种方法可以根据一个值对数组进行排序,如果它不是空的,位于顶部,其余的则下降。以下是我迄今为止所做的工作: foreach ((array)$accounts as $v=>$k){ if(!empty($k)) { echo $v; echo "</br>"; echo $k; echo "&

我有这个foreach循环,我想知道是否有一种方法可以根据一个值对数组进行排序,如果它不是空的,位于顶部,其余的则下降。以下是我迄今为止所做的工作:

foreach ((array)$accounts as $v=>$k){
        if(!empty($k)) {
                echo $v;
                echo "</br>";
                echo $k;
                echo "</br>";
        } else {
            echo $v;
            echo "</br>";
        }
    }
如您所见,
k2
没有值。我希望它位于底部,因为它没有值

直接用
打印($accounts,TRUE)
输出数组:


正如你所见,谷歌和Facebook没有价值观。因此,我希望它们位于底部。

您可以这样做,使用对数组进行排序,然后相应地使用它们

$accounts = (array) $accounts;
usort($accounts, function($a, $b) {
    return strlen($b) - strlen($a);
});
现在


您可以使用对数组进行排序,然后相应地使用它们

$accounts = (array) $accounts;
usort($accounts, function($a, $b) {
    return strlen($b) - strlen($a);
});
现在


您可以将自定义函数与一起使用,它将空值放在最后,但按字母顺序对其余值进行排序:

$accounts = array (
  'x' => 'c',
  'y' => 'a',
  'z' => 'b',
  'n' => '',
);

uasort($accounts, function($a, $b) {
    return empty($a) ? 1 : (empty($b) ? -1 : strcmp($a,$b));
});

var_export($accounts);
输出:

array (
  'y' => 'a',
  'z' => 'b',
  'x' => 'c',
  'n' => '',
)

您可以将自定义函数与一起使用,它将空值放在最后,但按字母顺序对其余值进行排序:

$accounts = array (
  'x' => 'c',
  'y' => 'a',
  'z' => 'b',
  'n' => '',
);

uasort($accounts, function($a, $b) {
    return empty($a) ? 1 : (empty($b) ? -1 : strcmp($a,$b));
});

var_export($accounts);
输出:

array (
  'y' => 'a',
  'z' => 'b',
  'x' => 'c',
  'n' => '',
)

感谢您最终提供了阵列结构

根据您的要求:

如果数组不是空的,则根据一个值对数组进行排序,使其位于顶部,其余的则向下

使用
uasort()
,不需要复杂的排序算法,请尝试以下操作:

<?php

$accounts= array(
    'TwitterSecKey'=>'Twitter Sec Key',
    'GoogleSecKey'=>null,
    'InstagramSecKey'=>'Instagram Sec Key',
    'FacebookSecKey'=>null
);

echo '<pre>'.print_r($accounts, TRUE).'</pre>';

arsort($accounts); // secret sauce

echo '<pre>'.print_r($accounts, TRUE).'</pre>';

感谢您最终提供了阵列结构

根据您的要求:

如果数组不是空的,则根据一个值对数组进行排序,使其位于顶部,其余的则向下

使用
uasort()
,不需要复杂的排序算法,请尝试以下操作:

<?php

$accounts= array(
    'TwitterSecKey'=>'Twitter Sec Key',
    'GoogleSecKey'=>null,
    'InstagramSecKey'=>'Instagram Sec Key',
    'FacebookSecKey'=>null
);

echo '<pre>'.print_r($accounts, TRUE).'</pre>';

arsort($accounts); // secret sauce

echo '<pre>'.print_r($accounts, TRUE).'</pre>';


这样更好,您可以添加数组,您正在尝试排序的内容@阿拉姆里
$v=>$k
…你想发动第三次世界大战吗
$v
$value
的缩写,
$k
$key
的缩写。在将其放入for each循环之前,请使用
asort($accounts)
也无需将$accounts强制转换为(数组)它已经是一个数组@MonkeyZeus帮我不要带它:)调用键
$v
,值
$k
=war。更好的是,你可以添加数组,你要排序的东西@阿拉姆里
$v=>$k
…你想发动第三次世界大战吗
$v
$value
的缩写,
$k
$key
的缩写。在将其放入for each循环之前,请使用
asort($accounts)
也无需将$accounts强制转换为(数组)它已经是一个数组@MonkeyZeus帮我不要带它:)调用键
$v
,值
$k
=war。先生,我已经更新了我的问题。你能再检查一下吗?现在理解起来可能更容易,但如果没有值,它就不会输出键。还有,所有的钥匙都换成了数字。顺便说一句,你忘了那里的一个符号,这让我一开始就迷路了。。如果您可以更正它,那么这个答案可能对其他人和像我这样的新手有用。就在
br
之后,只需添加一个
先生,我已经更新了我的问题。你能再检查一下吗?现在理解起来可能更容易,但如果没有值,它就不会输出键。还有,所有的钥匙都换成了数字。顺便说一句,你忘了那里的一个符号,这让我一开始就迷路了。。如果您可以更正它,那么这个答案可能对其他人和像我这样的新手有用。它就在
br
之后,只需添加一个
先生,您可以看到应该有一个键和一个值?它用数字替换键。。。有办法保留钥匙吗?当然,只需使用
uasort
而不是
usort
。答案已更新。先生,正如您所看到的,应该有一个键和一个值?它用数字替换键。。。有办法保留钥匙吗?当然,只需使用
uasort
而不是
usort
。回答更新。做得好。因为更简单、更干净而被接受:)谢谢你,一切都好了。因为更简单更干净而被接受:)非常感谢