Although this is an exercise in logic which, to the present moment, apparently has had no effort on the part of the demonstrated author, I would like to make my contribution anyway.
The solution is so simple that, apart from the input array, it is solved with only two lines:
$words = [ 'estudar', 'educação', 'esforço', 'persistência',
'dedicação', 'crescimento', 'evolução', 'sabedoria',
'trabalho', 'entusiasmo', 'alegria', 'vitoria',
'sucesso', 'profissão', 'conhecimento', 'vida' ];
$odd = array_filter( $words, function( $word ) { return ( strlen( $word ) % 2 == 0 ); } );
$even = array_diff( $words, $odd );
The resulting $ odd and $ even arrays contain, respectively:
array (size=8)
1 => string 'educação' (length=10)
2 => string 'esforço' (length=8)
6 => string 'evolução' (length=10)
8 => string 'trabalho' (length=8)
9 => string 'entusiasmo' (length=10)
13 => string 'profissão' (length=10)
14 => string 'conhecimento' (length=12)
15 => string 'vida' (length=4)
array (size=8)
0 => string 'estudar' (length=7)
3 => string 'persistência' (length=13)
4 => string 'dedicação' (length=11)
5 => string 'crescimento' (length=11)
7 => string 'sabedoria' (length=9)
10 => string 'alegria' (length=7)
11 => string 'vitoria' (length=7)
12 => string 'sucesso' (length=7)
Contrary to the @ friend's misplaced indication, using mb_strlen () , in this case, results in false positives as it causes the word accents are considered as additional lengths.
Recommended readings: