我有这个foreach循环,我想知道是否有一种方法可以对数组进行排序,如果它不是空的,那么它应该是一个值,而其余的则会下降。在这里我到目前为止做了什么:
foreach ((array)$accounts as $v=>$k){
if(!empty($k)) {
echo $v;
echo "</br>";
echo $k;
echo "</br>";
} else {
echo $v;
echo "</br>";
}
}
注意:$k
会返回一个字符串,或者它只是空而不是NULL
输出类似于:
k1
v1
k2
k3
v3
正如您所看到的,k2
没有任何价值。我希望它在底部,因为它没有价值。
使用print_r($accounts, TRUE)
直接输出数组:
Array
(
[TwitterSecKey] => Twitter Sec Key
[GoogleSecKey] =>
[InstagramSecKey] => Instagram Sec Key
[FacebookSecKey] =>
)
正如您所看到的,Google和Facebook没有价值观。所以我希望他们处于最底层。
答案 0 :(得分:1)
您可以使用usort对数组进行排序,然后相应地使用它们
$accounts = (array) $accounts;
usort($accounts, function($a, $b) {
return strlen($b) - strlen($a);
});
现在。
foreach($accounts as $k=>$v){
echo 'key: '. $k .'<br>';
echo 'value: '. $v .'<br>';
}
<强>更新强> 要保留密钥,您可以使用uasort作为
$accounts = (array) $accounts;
uasort($accounts, function($a, $b) {
return strlen($b) - strlen($a);
});
答案 1 :(得分:1)
你可以使用uasort
的自定义函数,它将空值放在最后,但按字母顺序对所有其余值进行排序:
$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' => '',
)
答案 2 :(得分:1)
感谢您最终提供阵列结构。
根据您的要求:
如果数组不是空的,那么对数值进行排序,使其位于顶部,其余的数据会下降
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>';