【问题标题】:Why does my code only return partial results? array_push not working for first element为什么我的代码只返回部分结果? array_push 不适用于第一个元素
【发布时间】:2019-06-01 02:46:18
【问题描述】:

所以我返回了一个从 MySQLi 查询返回的数组数组,正如您所见,它从我的图层数据库中提取不同的类别,然后返回与该类别关联的每个图层。

当使用 print_r 的代码返回所有层时,结果只是返回一些结果,而不是全部。

我哪里错了?

https://api.adameastwood.com/v1/TEST/logger.php -> print_r 和 foreach 循环的结果

$conn = new mysqli($sqlParams['host'], $sqlParams['username'], 
$sqlParams['password'], $sqlParams['database']);
$Query = "SELECT DISTINCT `Category` FROM `layers` WHERE `enabled` = 1 
ORDER BY `Category` ASC";
$menuCategories = [];

if ($result = $conn->query($Query))
{                   
while ($categoryRow = $result->fetch_row()){
    foreach($categoryRow as $key => $value)
    {           
        $layers = $conn->query("SELECT * FROM `layers` WHERE enabled = 1 AND Category = '$value' ORDER  BY LayerName ASC");

        while ($layerDetails = $layers->fetch_array()){

            $menuItems = array([
                'LCategory' => $layerDetails['Category'],
                'LayerCode' => $layerDetails['LayerCode'], 
                'LayerName' => $layerDetails['LayerName'],
            ]);

            foreach($menuItems as $item){
                print_r($item);

                $item = array('LayerDetails' => $item);
                array_push($menuCategories['menuItem'][$value], $item);

                foreach($item as $items => $itemValue)
                    array_push($menuCategories['menuItem'][$value][$itemValue], $itemValue);
            }
        }
    }
}
echo "\n\n";

Array
(
    [LCategory] => Council Assets
    [LayerCode] => RBC/AL
    [LayerName] => Available Land
)
Array
(
    [LCategory] => Council Assets
    [LayerCode] => RBC/COL
    [LayerName] => Council Owned Land
)
Array
(
    [LCategory] => Planning
    [LayerCode] => DC/CA
    [LayerName] => Conservation Areas
)
Array
(
    [LCategory] => Planning
    [LayerCode] => DC/LB
    [LayerName] => Listed Buildings
)
Array
(
    [LCategory] => Planning
    [LayerCode] => DC/PA
    [LayerName] => Planning Applications
)
Array
(
    [LCategory] => Planning
    [LayerCode] => DC/TPO
    [LayerName] => Tree Preservation Orders
)


{
    "menuItem": {
        "Council Assets": [
            {
            "LayerDetails": {
                "LCategory": "Council Assets",
                "LayerCode": "RBC\/COL",
                "LayerName": "Council Owned Land"
            }
        }
    ],
    "Planning": [
        {
            "LayerDetails": {
                "LCategory": "Planning",
                "LayerCode": "DC\/LB",
                "LayerName": "Listed Buildings"
            }
        },
        {
            "LayerDetails": {
                "LCategory": "Planning",
                "LayerCode": "DC\/PA",
                "LayerName": "Planning Applications"
            }
        },
        {
            "LayerDetails": {
                "LCategory": "Planning",
                "LayerCode": "DC\/TPO",
                "LayerName": "Tree Preservation Orders"
            }
        }
    ]
}
}

【问题讨论】:

  • 您能否告诉我们预期的结果是什么?您的代码过于复杂,我无法理解您想要实现的目标。
  • 嗨 Dharman,我正在尝试将数组 '$item' 解析为 JSON,但将结果组织到按 'LCategory' 分类的单独数组中
  • 您应该能够将您的 SQL 转换为单个查询。
  • 我认为这行应该有$items而不是$itemValue$menuCategories['menuItem'][$value][$itemValue]
  • 当你定义 menuItems 时,你使用双数组 - array[] - 为什么?这会导致 foreach($menuItems as $item) 的 for 循环只运行一次

标签: php arrays json mysqli


【解决方案1】:

您的代码有很多“不好的做法”行为 - 但让我们解决您的问题:

请注意,array-push 在给出 null 而不是数组时会发出警告(并且您永远不会在键 menuItem 或类别名称中初始化空数组)。但是,它确实会在发送命令后创建一个数组 - 因此,只有第一个元素被遗漏了。

将您的 array_push 更改为 []$menuCategories['menuItem'][$value][] = $item; 以使其按您的意愿工作(同时更改 array_push

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 2019-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多