【问题标题】:Remove elements from array based on value根据值从数组中删除元素
【发布时间】:2017-02-01 10:05:01
【问题描述】:

我有以下 PHP 数组(这是一个简化版本,用于说明)$myarray

Array
(
    [0] => Array
        (
        [firstName] => Zaphod
        [show_nav] => yes
        [lastName] => Beeblebrox
        )

    [1] => Array
        (
        [firstName] => Ford
        [show_nav] => 
        [lastName] => Prefect
        )

    [2] => Array
        (
        [firstName] => Arthur
        [show_nav] => yes
        [lastName] => Dent
        )

    [3] => Array
        (
        [firstName] => Tricia
        [show_nav] => 
        [lastName] => McMillan
        )
)

我需要删除show_nav 未设置为yes 的条目,并生成一个包含结果的新数组。所以之后它看起来像这样 - $myarray:

Array
(
    [0] => Array
        (
        [firstName] => Zaphod
        [show_nav] => yes
        [lastName] => Beeblebrox
        )

    [1] => Array
        (
        [firstName] => Arthur
        [show_nav] => yes
        [lastName] => Dent
        )
)

数组可以是任意长度,show_nav 设置为 yes 表示任意数量的条目。我知道如何删除特定条目,但我不确定如何查看数组并根据值删除条目。

非常感谢任何帮助!

【问题讨论】:

标签: php arrays


【解决方案1】:

有无数种方法可以实现这个简单的目标。其中一个使用PHP函数array_filter()

$filtered = array_filter(
    $myarray,
    function (array $item) {
        return array_key_exists('show_nav', $item) && $item['show_nav'] === 'yes';
    }
);

【讨论】:

    【解决方案2】:
    $p = array(
        array('firstName' => 'Zaphod', 'show_nav' => 'yes', 'lastName' => 'Beeblebrox'),
        array('firstName' => 'Ford', 'show_nav' => "", 'lastName' => 'Prefect'),
        array('firstName' => 'Arthur', 'show_nav' => "no", 'lastName' => 'Dent'),
        array('firstName' => 'Tricia', 'show_nav' => "", 'lastName' => 'McMillan')
    );
    foreach ($p as $m) {
        if (!($m['show_nav'] == "")) {
            $m1[] = $m;
        }
    }
    print_r($m1);
    

    【讨论】:

    • 这个纯代码的答案会有什么解释吗?为什么非正统的条件语法?
    【解决方案3】:
    <?php
    
    function partition( $list, $p ) {
        $listlen = count( $list );
        $partlen = floor( $listlen / $p );
        $partrem = $listlen % $p;
        $partition = array();
        $mark = 0;
        for ($px = 0; $px < $p; $px++) {
            $incr = ($px < $partrem) ? $partlen + 1 : $partlen;
            $partition[$px] = array_slice( $list, $mark, $incr );
            $mark += $incr;
        }
        return $partition;
    }
    
    $citylist = array( "Black Canyon City", "Chandler", "Flagstaff", "Gilbert", "Glendale", "Globe", "Mesa", "Miami",
                       "Phoenix", "Peoria", "Prescott", "Scottsdale", "Sun City", "Surprise", "Tempe", "Tucson", "Wickenburg" );
    print_r( partition( $citylist, 3 ) );
    
    ?>
    
    Array
    (
        [0] => Array
            (
                [0] => Black Canyon City
                [1] => Chandler
                [2] => Flagstaff
                [3] => Gilbert
                [4] => Glendale
                [5] => Globe
            )
    
        [1] => Array
            (
                [0] => Mesa
                [1] => Miami
                [2] => Phoenix
                [3] => Peoria
                [4] => Prescott
                [5] => Scottsdale
            )
    
        [2] => Array
            (
                [0] => Sun City
                [1] => Surprise
                [2] => Tempe
                [3] => Tucson
                [4] => Wickenburg
            )
    
    )
    

    【讨论】:

    • 这太复杂了。
    【解决方案4】:

    您需要循环查找您的“显示导航”并获取测试值,如果为空,则删除为:

    cpt = 0;
    foreach $my_arary as $users {
        foreach $users as line {
            if (line['show nav'] === '')
                 unset($my_array[cpt];
            cpt++;
        }
    }
    

    【讨论】:

    • 不,您没有使用现有的 PHP 函数。
    猜你喜欢
    • 1970-01-01
    • 2011-05-26
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    • 2017-09-18
    • 1970-01-01
    相关资源
    最近更新 更多