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

时间:2016-02-26 16:12:07

标签: php

我有这个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没有价值观。所以我希望他们处于最底层。

3 个答案:

答案 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>';

http://php.net/manual/en/array.sorting.php