繁体   English   中英

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

[英]Sorting an array in a foreach loop if value is not empty

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

您可以使用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);
    });

您可以将自定义函数与uasort一起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' => '',
)

感谢您最终提供您的数组结构。

根据您的要求:

如果数组不为空,则将数组的值排序为一个值,然后将其舍弃

不需要使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM