php unset 数组 下标不错位 array_filter 直接在原数组上操作 filter myfilter

* Arr.php

class Arr {
    public static function some($a, callable $c) {
        $n = count($a);
        for ($i = 0; $i < $n; $i++) {
            if (call_user_func($c, $a[$i])) {
                return true;
            }
        }
        return false;
    }

    /**
     * 在原数组上过滤 不需要把返回值=重新赋值 也不需要array_values更新index
     * @param array $a
     * @param callable $c
     */
    public static function filter(array &$a, callable $c) {
        for ($i = 0; $i < count($a);) {
            if (call_user_func($c, $a[$i]) ) {
                $i++;
            } else {
                self::myUnset($a, $i);
            }
        }
    }

    private static function myUnset(array& $arr, $i) {
        $n = count($arr);
        if ($i<0 || $i >= $n) {
            return;
        }
        for ($j = $i+1; $j < $n; $i++, $j++) {
            $arr[$i] = $arr[$j];
        }
        unset($arr[$i]);
    }

}

替换系统的array_filter函数

 

* myunset.php

<?php

function myunset(array& $arr, $i) {
	if ($i<0 || $i >= count($arr)) {
		return;
	}
	for ($j = $i+1; $j < count($arr); $i++, $j++) {
		$arr[$i] = $arr[$j];
	}
	unset($arr[$i]);
}

// test

$a = str_split("UNSET");
myunset($a, 0);
// unset($a[0]);
var_dump($a);

 

php myunset.php
D:\test\myunset.php:16:
array(4) {
  [0] =>
  string(1) "U"
  [1] =>
  string(1) "N"
  [2] =>
  string(1) "S"
  [3] =>
  string(1) "E"
}

 

如果调用系统的 unset($a[0]);

下标为0的键值对丢失, 调用json_encode,导致类型转换, 数组转换为对象, 意想不到的错误

>php myunset.php
D:\test\myunset.php:16:
array(4) {
  [1] =>
  string(1) "N"
  [2] =>
  string(1) "S"
  [3] =>
  string(1) "E"
  [4] =>
  string(1) "T"
}

 

http://php.net/manual/en/function.array-filter.php

array_filter返回一个新的数组,如果要在原数组上操作 myfilter.php

// 仅试用与索引数组array, 不能是map, Object

<?php

function myunset(array& $arr, $i) {
    if ($i<0 || $i > count($arr)) {
        return;
    }
    for ($j = $i+1; $j < count($arr); $i++, $j++) {
        $arr[$i] = $arr[$j];
    }
    unset($arr[$i]);
}

function myfilter(array &$a, callable $c) {
    for ($i = 0; $i < count($a);) {
        if (call_user_func($c, $a[$i]) ) {
            $i++;
        } else {
            myunset($a, $i);  
        }
    }
}

// test:

$s = '[{"id":2273,"user_id":27952046,"course_guid":"P33950","session_id":"0ce4d8f2b3dc09e9b01ecdb6f1316f9b","insert_time":"2018-05-19 16:38:28","remarks":"{\"isnewpolicyarea\":0,\"ischoice\":0,\"province\":\"\\u5317\\u4eac\",\"activemethod\":\"00\"}","source":3},{"id":2274,"user_id":27952046,"course_guid":"P33877","session_id":"0ce4d8f2b3dc09e9b01ecdb6f1316f9b","insert_time":"2018-05-19 17:00:56","remarks":"{\"isnewpolicyarea\":0,\"ischoice\":0,\"province\":\"\",\"activemethod\":\"00\"}","source":1},{"id":2275,"user_id":27952046,"course_guid":"P40355","session_id":"0ce4d8f2b3dc09e9b01ecdb6f1316f9b","insert_time":"2018-05-19 17:37:20","remarks":"{\"isnewpolicyarea\":0,\"ischoice\":0,\"province\":\"\\u8d35\\u5dde\",\"activemethod\":\"00\"}","source":1},{"id":2283,"user_id":29355088,"course_guid":"P39556","session_id":"u9kdf9je2tb1hdht19oalpbfl4","insert_time":"2018-10-25 08:38:42","remarks":"{\"isnewpolicyarea\":0,\"ischoice\":0,\"province\":\"\\u6e56\\u5317\",\"activemethod\":\"00\"}","source":1}]';
$a = json_decode($s);
myfilter($a, function($o) {
    return $o->source === 3;
});

// echo '<pre>';
var_dump($a);

$array1 = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5);
$array2 = array(6, 7, 8, 9, 10, 11, 12);

var_dump($array1[0]);
//myfilter($array1, function($var) {
//    return ($var & 1);
//});
//print_r($array1);

myfilter($array2, function($var) {
    return ! ($var & 1);
});
print_r($array2);

 

D:\test>php filter.php

array(1) {

  [0]=>

  object(stdClass)#1 (7) {

    ["id"]=>

    int(2273)

    ["user_id"]=>

    int(27952046)

    ["course_guid"]=>

    string(6) "P33950"

    ["session_id"]=>

    string(32) "0ce4d8f2b3dc09e9b01ecdb6f1316f9b"

    ["insert_time"]=>

    string(19) "2018-05-19 16:38:28"

    ["remarks"]=>

    string(74) "{"isnewpolicyarea":0,"ischoice":0,"province":"北京","activemethod":"00"}"

    ["source"]=>

    int(3)

  }

}

NULL

Array

(

    [0] => 6

    [1] => 8

    [2] => 10

    [3] => 12

)

开发环境要打开所有错误信息:

<?php

error_reporting(E_ALL);
ini_set('display_errors', 1);

?>

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
PHP中的数组Array)是一种用于存储多个相同类型数据的容器,可以通过单一变量名来访问数组中的每个元素。 以下是一些PHP数组的基本知识: 1. 数组元素可以是任何数据类型,包括整数、浮点数、字符串、对象等; 2. 数组元素的下标可以是整数或者字符串; 3. 如果一个数组下标是整数,那么它将被当做索引数组来处理,否则将被当做关联数组处理; 4. PHP数组是动态的,可以随时添加或删除元素; 5. 数组元素可以通过下标访问,下标可以是变量; 6. PHP提供了一系列数组函数,可以用来操作数组。 创建数组 可以使用array()或者[]来创建一个数组,例如: // 使用array()语法创建数组 $arr1 = array('apple', 'banana', 'orange'); // 使用[]语法创建数组 $arr2 = ['apple', 'banana', 'orange']; 可以使用数组下标访问数组元素,例如: echo $arr1[0]; // 输出apple echo $arr2[1]; // 输出banana 添加元素 可以使用下标为一个数组添加元素,例如: $arr = ['apple', 'banana', 'orange']; $arr[3] = 'peach'; 也可以使用array_push()函数向一个数组添加元素,例如: $arr = ['apple', 'banana', 'orange']; array_push($arr, 'peach', 'pear'); 删除元素 可以使用unset()函数删除一个数组元素,例如: $arr = ['apple', 'banana', 'orange']; unset($arr[0]); 也可以使用array_pop()函数删除一个数组末尾的元素,例如: $arr = ['apple', 'banana', 'orange']; array_pop($arr); 遍历数组 可以使用foreach()函数来遍历一个数组,例如: $arr = ['apple', 'banana', 'orange']; foreach ($arr as $value) { echo $value . '<br>'; } 也可以同时获取数组元素的下标和对应的值,例如: $arr = ['apple', 'banana', 'orange']; foreach ($arr as $key => $value) { echo $key . ' - ' . $value . '<br>'; } 数组函数 PHP提供了一系列数组函数,可以用来操作数组,例如: count():返回数组中元素的个数; array_merge():合并两个或多个数组array_reverse():将一个数组中的元素顺序颠倒; array_search():在数组中查找指定的值,并返回其对应的下标; in_array():判断一个值是否在数组中存在; sort():对数组进行排序; ksort():按照数组的键进行排序。 以上仅是PHP数组的基本知识,PHP数组的用法还有很多其他特性,需要读者自行学习和掌握。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fareast_mzh

打赏个金币

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值