stream icon indicating copy to clipboard operation
stream copied to clipboard

Refactored array_filter() to explicitly check !is_null() AND strlen() in class-log.php

Open justinmaurerdotdev opened this issue 1 year ago • 3 comments
trafficstars

… because passing 'strlen' as a callable caused warnings on null values.

Fixes #1349.

The previously-merged commits did not, in fact, fix this issue. Null values were being passed through array_filter() with 'strlen' as the callable, but strlen() no longer accepts null values. Should be fixed now, with an explicit null check added.

OLD:

$exclude_rules = array_filter($exclude, 'strlen' );

NEW:

$exclude_rules = array_filter( $exclude, function ( $val ) {
	return !is_null( $val ) && strlen( $val );
});

Checklist

  • [n/a] Project documentation has been updated to reflect the changes in this pull request, if applicable.
  • [X] I have tested the changes in the local development environment (see contributing.md).
  • [ ] I have added phpunit tests.

Release Changelog

  • Fix: Describe a bug fix included in this release.
  • New: Describe a new feature in this release.

Release Checklist

  • [ ] This pull request is to the master branch.
  • [ ] Release version follows semantic versioning. Does it include breaking changes?
  • [ ] Update changelog in readme.txt.
  • [ ] Bump version in stream.php.
  • [ ] Bump Stable tag in readme.txt.
  • [ ] Bump version in classes/class-plugin.php.
  • [ ] Draft a release on GitHub.

Change [ ] to [x] to mark the items as done.

justinmaurerdotdev avatar Jan 10 '24 17:01 justinmaurerdotdev

Ouch, I wonder if strlen() changes also kill plans in #1312 :(

lkraav avatar Jan 10 '24 19:01 lkraav

Hmm, yeah. If it is being used to filter null values, then it likely will cause the same problem. The two refactoring options, as far as I can tell are:

  1. My above solution, or some similar variation where you check for null in the filter's callable, or
  2. An additional, array_filter() preceding the existing one to filter null values

I think Option 1 wins both for performance (Option 2 re-iterating the whole array) and presentation. There's no native is_not_null function. If there were, Option 2 would at least win on aesthetics:

$exclude_rules = array_filter($exclude, 'is_not_null' );
$exclude_rules = array_filter($exclude, 'strlen' );

In reality, it has to be something like

$exclude_rules = array_filter( $exclude, function ( $val ) {
	return !is_null( $val );
});
$exclude_rules = array_filter($exclude, 'strlen' );

So, we might as well combine them and save the extra loop. Though, this may be a sign of some upstream issue with how the how/why the null values are there in the first place... I'm new to this codebase, so I can't speak to that at all.

justinmaurerdotdev avatar Jan 10 '24 23:01 justinmaurerdotdev

I already created a PR for this in #1466 which also ensures that only strings are passed to strlen().

ocean90 avatar Jan 15 '24 08:01 ocean90