PHP按title属性对嵌套数组字母排序报错:title未定义
嵌套数组按指定字段排序问题解决
问题说明
需要将数组中area为TACT的项内的pages子数组,按title字段的字母顺序排序,但直接使用usort排序整个主数组时,出现'title'未定义的错误。
原数组结构
My Array ( [0] => Array ( [area] => TACT [pages] => Array ( [0] => Array ( [id] => 1484 [title] => Registry ) [1] => Array ( [id] => 1385 [title] => Education ) ) ) )
期望排序后的数组
My Array ( [0] => Array ( [area] => TACT [pages] => Array ( [0] => Array ( [id] => 1385 [title] => Education ) [1] => Array ( [id] => 1484 [title] => Registry ) ) ) )
错误代码分析
之前尝试的代码直接对主数组$myArray调用usort,但主数组的元素是包含area和pages的数组,本身没有title键,因此会触发未定义错误:
function sort_alpha_title($a, $b) { return strnatcmp($a['title'], $b['title']); } usort($myArray, 'sort_alpha_title');
正确解决方案
需要先遍历主数组,定位到area为TACT的项,再对该项的pages子数组执行排序:
方案1:使用独立排序函数
// 定义按title自然排序的函数 function sort_alpha_title($a, $b) { return strnatcmp($a['title'], $b['title']); } // 遍历主数组,找到目标项并排序pages子数组 foreach ($myArray as &$item) { if ($item['area'] === 'TACT') { usort($item['pages'], 'sort_alpha_title'); } } // 解除引用,避免后续操作污染原数组 unset($item);
方案2:使用匿名函数(更简洁)
foreach ($myArray as &$item) { if ($item['area'] === 'TACT') { usort($item['pages'], function($a, $b) { return strnatcmp($a['title'], $b['title']); }); } } unset($item);
这样操作后,只有area为TACT的项内的pages子数组会按title字母顺序排序,且不会触发title未定义的错误。
内容的提问来源于stack exchange,提问作者tomhuckle
相关产品推荐
相关产品推荐

